Назад | Перейти на главную страницу

Удаленная команда 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*

(подстановочный знак соответствует некоторым файлам - 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'