1

Я выполняю следующее в терминале Unix:

client$: ssh host "cat foo.txt"

и ожидая, что выходной файл и ssh-соединение будут закрыты, т.е.

bar
client$:

На самом деле происходит то, что cat не производит никаких выходных данных, а терминал все еще находится на удаленном хосте

server$ :

Теперь я могу сделать «cat foo.txt» и получить содержимое файла и закрыть соединение с помощью выхода или выхода из системы. Выход из ssh это:

debug1: Entering interactive session.
debug2: callback start
debug2: client_session2_setup: id 0
debug1: Sending environment.
debug1: Sending env LANG = en_GB
debug2: channel 0: request env confirm 0
debug1: Sending command: cat foo.txt
debug2: channel 0: request exec confirm 0
debug2: callback done
debug2: channel 0: open confirm rwindow 0 rmax 32768
debug2: channel 0: rcvd adjust 2097152

У меня есть другая учетная запись пользователя, для которой это на самом деле работает нормально, но до сих пор я не смог найти разницу в настройке / профиле, которая могла бы вызывать такое поведение. Вывод ssh для работающей учетной записи пользователя:

debug1: Entering interactive session.
debug2: callback start
debug2: client_session2_setup: id 0
debug1: Sending environment.
debug1: Sending env LANG = en_GB
debug2: channel 0: request env confirm 0
debug1: Sending command: cat foo.txt
debug2: channel 0: request exec confirm 0
debug2: callback done
debug2: channel 0: open confirm rwindow 0 rmax 32768
debug2: channel 0: rcvd adjust 2097152
bar
debug2: channel 0: rcvd eof
debug2: channel 0: output open -> drain
debug2: channel 0: obuf empty
debug2: channel 0: close_write
debug2: channel 0: output drain -> closed
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug2: channel 0: rcvd close
debug2: channel 0: close_read
debug2: channel 0: input open -> closed
debug2: channel 0: almost dead
debug2: channel 0: gc: notify user
debug2: channel 0: gc: user detached
debug2: channel 0: send close
debug2: channel 0: is dead
debug2: channel 0: garbage collecting
debug1: channel 0: free: client-session, nchannels 1
debug1: Transferred: stdin 0, stdout 0, stderr 0 bytes in 0.2 seconds
debug1: Bytes per second: stdin 0.0, stdout 0.0, stderr 0.0
debug1: Exit status 0

Есть ли очевидные настройки, которые могут быть причиной этого? Или какие-либо опции ssh, которые могут помочь? Я посмотрел в .bashrc и .bash_profile, но я не вижу ничего, что может быть причиной. Оба пользователя не имеют .ssh/config, поэтому я думаю, что конфигурация общесистемная в /etc /ssh /ssh_config. Запуск ssh -n host "cat foo.txt" закрывает соединение, но все еще не выводит cat:

debug1: Entering interactive session.
debug2: callback start
debug2: client_session2_setup: id 0
debug1: Sending environment.
debug1: Sending env LANG = en_GB
debug2: channel 0: request env confirm 0
debug1: Sending command: cat foo.txt
debug2: channel 0: request exec confirm 0
debug2: callback done
debug2: channel 0: open confirm rwindow 0 rmax 32768
debug2: channel 0: rcvd adjust 2097152
debug2: channel 0: read<=0 rfd 5 len 0
debug2: channel 0: read failed
debug2: channel 0: close_read
debug2: channel 0: input open -> drain
debug2: channel 0: ibuf empty
debug2: channel 0: send eof
debug2: channel 0: input drain -> closed
debug2: channel 0: rcvd eof
debug2: channel 0: output open -> drain
debug2: channel 0: obuf empty
debug2: channel 0: close_write
debug2: channel 0: output drain -> closed
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug2: channel 0: rcvd close
debug2: channel 0: almost dead
debug2: channel 0: gc: notify user
debug2: channel 0: gc: user detached
debug2: channel 0: send close
debug2: channel 0: is dead
debug2: channel 0: garbage collecting
debug1: channel 0: free: client-session, nchannels 1
debug1: Transferred: stdin 0, stdout 0, stderr 0 bytes in 0.3 seconds
debug1: Bytes per second: stdin 0.0, stdout 0.0, stderr 0.0
debug1: Exit status 0

2 ответа2

1

Попробуйте использовать ssh -T "username@"host" "cat foo.txt"

-T останавливает назначение псевдо-tty терминала

или провалить эту попытку

echo "cat foo.txt" | ssh "username"@"host"

который должен просто работать как ssh "username"@"host" "cat foo.txt"

просто подумал о другом вместо эха, попробуйте использовать

ssh -t -t "username"@"host" "cat foo.txt"

0

Я не уверен, относится ли это к вашему случаю, но я смог решить подобную проблему на Ubuntu 16.10, отредактировав .bashrc:

От:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) exit;;
esac

Для того, чтобы:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

Так что, если вы можете найти exit где-нибудь в ваших конфигурационных файлах, возможно, это то, что делает гадости.

Просто замените его на return .

Ура,
Гас

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .