使用‘*’时 ssh 远程命令 ls 挂起

使用‘*’时 ssh 远程命令 ls 挂起

我在使用 ssh 中的远程命令时遇到了问题。

以下命令运行良好:

ssh remote_server ls /path/to/folder/

(列出文件夹的所有文件-确定)

ssh remote_server ls /path/to/folder/file_000*

(通配符匹配文件夹的一个文件-确定)

以下命令挂起:

ssh remote_server ls /path/to/folder/file*

(通配符匹配某些文件 - 挂起)

ssh remote_server ls /path/to/folder/*

(通配符匹配所有文件 - 挂起)

远程文件夹中的文件数量并不合理:大约 50 个文件,其中 40 个与“file*”正则表达式匹配。

使用 -vvv 标志运行 ssh 会给出以下输出

[...]
debug1: Authentication succeeded (publickey).
debug1: channel 0: new [client-session]
debug3: ssh_session2_open: channel_new: 0
debug2: channel 0: send open
debug1: Requesting [email protected]
debug1: Entering interactive session.
debug3: Wrote 136 bytes for a total of 2469
debug1: client_input_global_request: rtype [email protected] want_reply 0
debug2: callback start
debug2: client_session2_setup: id 0
debug1: Sending environment.
debug3: Ignored env HOSTNAME
debug3: Ignored env SHELL
debug3: Ignored env TERM
debug3: Ignored env HISTSIZE
debug3: Ignored env USER
debug3: Ignored env LD_LIBRARY_PATH
debug3: Ignored env LS_COLORS
debug3: Ignored env ORACLE_SID
debug3: Ignored env ORACLE_BASE
debug3: Ignored env MAIL
debug3: Ignored env PATH
debug3: Ignored env PWD
debug1: Sending env LANG = en_US.UTF-8
debug2: channel 0: request env confirm 0
debug3: Ignored env HISTCONTROL
debug3: Ignored env SHLVL
debug3: Ignored env HOME
debug3: Ignored env LOGNAME
debug3: Ignored env CLASSPATH
debug3: Ignored env LESSOPEN
debug3: Ignored env ORACLE_HOME
debug3: Ignored env G_BROKEN_FILENAMES
debug3: Ignored env OLDPWD
debug3: Ignored env _
debug1: Sending command: ls /u01/app/oracle/backup/rman/*
debug2: channel 0: request exec confirm 1
debug2: fd 3 setting TCP_NODELAY
debug2: callback done
debug2: channel 0: open confirm rwindow 0 rmax 32768
debug3: Wrote 152 bytes for a total of 2621
debug2: channel 0: rcvd adjust 2097152
debug2: channel_input_status_confirm: type 99 id 0
debug2: exec request accepted on channel 0

在哪一点,挂起。

有任何想法吗?

源是 Oracle Linux 6.9 命运是 Oracle Linux 7.5

答案1

bash 通配符扩展的工作方式是,/some/thing*您的命令始终会在本地系统上进行扩展,即使ssh在行首也是如此。出乎意料,但仍然如此。

为了完成你的预期任务,请始终使用引号: ssh user@host 'ls /path/to/file*'

在您的成功测试中:如果您的系统没有,/path/to/folder/file_000*它会将相同的字符串发送/path/to/folder/file_000*到远程。

在你的糟糕测试中:如果你的系统有/path/to/folder/file_some_name/path/to/folder/file_yet_another然后它会将这些字符串发送到远程而不是/path/to/folder/file*

首先,挂起可能发生在列出本地文件期间的本地系统上 - 例如在文件系统级别挂起。

其次,当您通过网络发送文本上更长的字符串时,您可能会遇到 MTU 问题(最大传输单元)。如果所有数据包都小于 MTU,则 MTU 问题不会被注意到。

建议的测试用例

仅测试一个方向的网络问题:

ssh user@host  'echo Type here some text that is longer than 1500 bytes > /tmp/delete_me'

相关内容