С помощью ssh -t
вместо того ssh
для подключения к удаленным серверам имеет ряд преимуществ. Например, я могу напрямую редактировать файл с помощью vim: ssh -t host vim foo.txt
, что в противном случае не удалось бы.
Существуют ли обстоятельства, при которых выделение (псевдо) -tty было бы плохим при использовании ssh?
При передаче по конвейеру ввода или получении ввода обратно, что является типичным использованием «команды хоста ssh». Управляющие символы могут интерпретироваться слоем TTY (например, ^ S).
Да, иногда вы хотите установить бесшумное фоновое соединение, например, при настройке туннеля (например, прокси-сервер SOCKS). В таких примерах вы хотите, чтобы у процесса НЕ был tty.
Вот пример настройки переадресации портов с localhost на какой-то удаленный хост ...
ssh -l username -fNTL 8073:server:873
После того, как это было настроено, вы можете затем rsync на localhost, а не на удаленный хост, следовательно, эффективно туннелируя ваш rsync через ssh
...
rsync --port=8073 -a me@localhost::myStuff /tmp/myStuff/
Вы бы сказали, что если rsync выходит на server
был заблокирован, но ssh
не было.
В дополнение к вышесказанному ...
(1) Различные способы обработки побега тильды:
Символ "~." escape отключит вас, если у вас есть pty (-t). Для длительно выполняющейся команды вы можете захотеть предотвратить случайную остановку процесса кем-либо, если они напечатают ~.
$ ssh hostname.tomontime.com -t sleep 60
[введите ~. и он отключается]
Подключение к hostname.tomontime.com закрыто.
$ ssh hostname -T sleep 60
[Я печатаю ~. и обрабатывает это как обычные нажатия клавиш, которые игнорируются командой сна.]
~.
~.
Попробуйте то же самое с CTRL-C. Вы увидите, что с -t вы отправляете CTRL-C в «спящий режим». С -T вы отправляете CTRL-C программе ssh, запущенной на вашем компьютере. Могут быть случаи, когда это имеет значение (т.е. программа обрабатывает INT иначе, чем HUP)
(2) Вы просто хотите минимизировать активность pty или сетевых подключений.
При попытке перезагрузить компьютер, на котором закончился pty, вы не хотите, чтобы система пыталась выделить pty! Это также минимизирует сетевые соединения, которые необходимо закрыть (задержка перезагрузки).
Это будет работать быстрее и надежнее:
ssh -T перезагрузка имени хоста
Могут возникнуть проблемы:
ssh -t перезагрузка имени хоста
ssh -t создает псевдотерминал на удаленной машине. Это полезно, если вы связываете команды ssh через несколько серверов и хотите, чтобы на дальней стороне был настоящий терминал (например, вы можете использовать vi).
Возможно, вам НЕ понадобится '-t', если сценарии входа в систему ведут себя по-другому, если есть терминал. Это плохая практика, IMHO, но я видел случаи, когда сценарий входа в систему проверял TTY перед 1) установкой приглашения и 2) расширением пути ко многим интерактивным приложениям.
В другом случае (упомянутом выше TomOnTime) я действительно сталкивался со случаями, когда все TTY (ptys) использовались. Очевидно неправильная конфигурация, но не нужно пережевывать ресурс для кучи туннелей и rsync.