У меня проблема с удаленной командой в 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*
(подстановочный знак соответствует некоторым файлам - HANGS)
ssh remote_server ls /path/to/folder/*
(подстановочный знак соответствует всем файлам - HANGS)
В удаленной папке нет необоснованного количества файлов: около 50, 40 из них будут соответствовать регулярному выражению 'file *'.
Запуск ssh с флагом -vvv дает мне следующий результат
[...]
debug1: Authentication succeeded (publickey).
debug1: channel 0: new [client-session]
debug3: ssh_session2_open: channel_new: 0
debug2: channel 0: send open
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug3: Wrote 136 bytes for a total of 2469
debug1: client_input_global_request: rtype hostkeys-00@openssh.com 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 Destiny - Oracle Linux 7.5
Расширение подстановочных знаков 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'