SSH-вызов SFTP-подсистемы с помощью командной строки

#ssh #sftp

#ssh #sftp

Вопрос:

Я столкнулся с проблемой, когда у меня есть SFTP-сервер (без доступа к SSH-оболочке).

Когда с клиентской машины я делаю запрос SFTP, он работает:

 sftp username@remote_IP
 

Затем, если я выполняю запрос SSH, он зависает

 ssh -l username -s remote_IP sftp
 

Но ssh справочная страница предполагает , что

 -s      May be used to request invocation of a subsystem on the remote
        system.  Subsystems facilitate the use of SSH as a secure
        transport for other applications (e.g. sftp(1)).  The subsystem
        is specified as the remote command.
 

Должен ли SSH-сервер на удаленном сервере включать это или есть какой-то другой выход для этого?

Добавление подробных журналов …. позвольте мне сначала поделиться с вами sftp подробными журналами режима, которые предполагают:

 debug1: Authentication succeeded (publickey)
debug1: fd 5 setting O_NONBLOCK
debug2: fd 6 is O_NONBLOCK
debug2: TCP receive buffer size: 49640 B
debug1: SSH receive window size: 198560 B
debug1: channel 0: new [client-session]
debug3: ssh_session2_open: channel_new: 0
debug1: send channel open 0
debug1: Entering interactive session.
debug2: callback start
debug1: ssh_session2_setup: id 0
debug1: Sending subsystem: sftp
debug1: channel request 0: subsystem
debug2: callback done
debug1: channel 0: open confirm rwindow 2097152 rmax 32768
debug2: Remote version: 3
debug3: Sent message fd 5 T:16 I:1
debug3: SSH_FXP_REALPATH . -> /root
sftp> pwd
 

Теперь я показываю подробный вывод ssh -l username -s remote_IP sftp

 debug1: Authentication succeeded (publickey).
debug1: channel 0: new [client-session]
debug3: ssh_session2_open: channel_new: 0
debug2: channel 0: send open
debug1: Entering interactive session.
debug2: callback start
debug2: client_session2_setup: id 0
debug1: Sending subsystem: sftp
debug2: channel 0: request subsystem confirm 1
debug2: fd 4 setting TCP_NODELAY
debug2: callback done
debug2: channel 0: open confirm rwindow 2097152 rmax 32768
debug2: channel_input_status_confirm: type 99 id 0
debug2: subsystem request accepted on channel 0
 

Вот где он висит.

Короче говоря, проблема заключается в следующем: «Если SFTP работает и включен на сервере, что происходит с ssh вызывающей подсистемой sftp на удаленном сервере»? Что именно требуется на стороне сервера или, по сути, на стороне клиента, чтобы заставить его работать?

Пожалуйста, проясните мое базовое понимание, если я что-то не так понял.

Ответ №1:

Что вы ожидаете от этого?

Запускается SFTP-сервер. И сервер ожидает запросов SFTP, в частности для SSH_FXP_INIT . И он никогда не получает его. SSH terminal ( ssh ) вряд ли отправит SFTP-пакет.

Итак, он зависает. Как и ожидалось.


(Обратите внимание, что, несмотря на то же самое, SSH_FXP_INIT это запрос SFTP, а не запрос SSH. SSH_FXP Расшифровывается как что-то вроде «SSH f ile e x change p rotocol»)


Вы действительно не объяснили нам, чего вы ожидаете.

Итак, позвольте мне угадать.

Вы действительно считаете, что SFTP является текстовым протоколом. Что команды (например rm , put , и т.д.), Которые вы вводите в sftp (клиент SFTP командной строки OpenSSH), являются реальными командами, которые отправляются на сервер. Это не так. SFTP — это двоичный протокол. Эти команды являются проприетарными командами одной конкретной клиентской реализации SFTP. Клиент (OpenSSH sftp ) преобразует эти текстовые команды в двоичные пакеты / запросы SFTP и отправляет их на сервер. А затем он преобразует двоичные ответы с SFTP-сервера в текстовые сообщения, читаемые человеком.

Эти текстовые команды не могут быть реальным обменом с сервером даже теоретически. Простые команды, такие как rm , могли бы. Но как насчет put или get ? Если вы это сделаете put /local/path , как SFTP-сервер может получить доступ к локальному файлу для его чтения? Это невозможно. Это делает SFTP-клиент.

Это похоже на FTP. FTP — это текстовый протокол. Теоретически вы можете связаться с FTP-сервером, введя команды. Например, вы можете удалить удаленные файлы таким образом (с помощью DELE /path/to/file command). Но вы не можете загружать или скачивать файлы таким образом. Это требует взаимодействия с локальным программным обеспечением FTP.

Что именно требуется на стороне сервера или, по сути, на стороне клиента, чтобы заставить его работать?

Ваш сервер работает так, как ожидалось. Но вам нужен реальный SFTP-клиент на стороне клиента.

Комментарии:

1. Привет, Мартин, спасибо за быстрый ответ, в данном конкретном случае SSH_FXP_INIT был отправлен клиентом. Означает отправку 1-го пакета SFTP. Он также получает второе сообщение от сервера (как видно из анализа дампа wireshark) … все еще зависает клиент

2. Какой клиент отправляет SSH_FXP_INIT ? Не имеет смысла. Итак, покажите нам дамп.

3. подробнее… клиент зависает на debug1: Отправляющая подсистема: sftp debug2: канал 0: запрос подсистемы подтвердите 1 debug2: настройка fd 4 TCP_NODELAY debug2: обратный вызов выполнен debug2: канал 0: открыть подтверждение rwindow 2097152 rmax 32768 debug2: channel_input_status_confirm: введите 99 id 0 debug2: запрос подсистемы принят на канале 0

4. Это не дает нам никакой информации, которую мы еще не знаем. Он не показывает обмена пакетами SFTP.

5. Короче говоря, проблема заключается в том, «Если SFTP работает и включен на сервере, что происходит с ssh, который вызывает подсистему stfp на удаленном сервере». Что именно требуется на стороне сервера, чтобы заставить его работать.