我在使用 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'