Каково преимущество не выделения терминала в ssh?

Можно ли показать больше подробного кластерного журнала? Администратор почты отказывает произвольно? Которые кодируют, это возвращается к ОС? Сколько кластеров PostgreSQL Вы имеете, только 8.4/основных?

Что относительно Вашего kernel.shmall и kernel.shmmni? Попытайтесь использовать ipcs-ml, ipcs-m и проверить Вашу память (свободный, лучший, Системный монитор) использование. Попытайтесь успокоить уничтожителя OOM:

vm.overcommit_memory = 2
vm.overcommit_ratio = 50

AFAIK sysctl -w не изменяет параметрические усилители постоянно (только до следующей перезагрузки ОС), и необходимо добавить kernel.shmmax=367108864 к/etc/sysctl.conf.

Если возможное обновление Ваш PostgreSQL к 8.4.8, как предложено в политике Управления версиями:

Мы всегда рекомендуем, чтобы все пользователи работали, последний доступный незначительный выпуск для любой основной версии используется.

Я думаю, что это - вероятно, уничтожающая проблема OOM, потому что она уничтожает администратора почты с сигналом SIGKILL и не освобождая общую память. Взгляд на документацию:

Важный: лучше не использовать SIGKILL для закрытия сервера. Выполнение так будет препятствовать тому, чтобы сервер освободил общую память и семафоры, которые, возможно, затем придется сделать вручную, прежде чем новый сервер может быть запущен. Кроме того, SIGKILL уничтожает процесс пост-ГРЭС, не позволяя этому передать сигнал к его подпроцессам, таким образом, будет необходимо уничтожить отдельные подпроцессы вручную также.

и здесь:

n Linux 2.4 и позже, поведение виртуальной памяти по умолчанию не оптимально для PostgreSQL. Из-за способа, которым ядро реализует память, принимают на себя непосильные обязательства, ядро могло бы завершить сервер PostgreSQL (процесс главного сервера), если требования памяти другого процесса заставляют систему исчерпывать виртуальную память.

BTW max_connections являются "дешевыми". Скорее уменьшите shared_buffers.

66
задан 6 May 2014 в 17:06
5 ответов

Основное отличие заключается в концепции интерактивности . Это похоже на выполнение команд локально внутри сценария, а не на ввод их самостоятельно. Он отличается тем, что удаленная команда должна выбирать значение по умолчанию, а неинтерактивный режим является наиболее безопасным. (и обычно самый честный)

STDIN

  • Если выделен PTY, приложения могут обнаружить это и знать, что можно безопасно запрашивать у пользователя дополнительный ввод, не нарушая работу. Есть много программ, которые пропускают этап запроса пользователя на ввод, если терминал отсутствует, и это хорошо. В противном случае это приведет к ненужному зависанию сценариев.
  • Ваш ввод будет отправлен на удаленный сервер на время выполнения команды. Сюда входят управляющие последовательности. Хотя разрыв Ctrl-c обычно приводит к немедленному прерыванию цикла команды ssh, ваши управляющие последовательности вместо этого будут отправлены на удаленный сервер. Это приводит к необходимости «забивать» нажатие клавиши, чтобы гарантировать, что оно поступит, когда элемент управления покидает команду ssh, но до начала следующей команды ssh.

Я бы предостерегал от использования ssh - t в автоматических скриптах, таких как crons. Неинтерактивная оболочка, запрашивающая у удаленной команды интерактивное поведение при вводе, вызывает всевозможные проблемы.

Вы также можете проверить наличие терминала в ваших собственных сценариях оболочки. Чтобы протестировать STDIN с более новыми версиями bash:

# fd 0 is STDIN
[ -t 0 ]; echo $?

STDOUT

  • При псевдониме ssh на ssh -t , вы можете ожидать получить дополнительный возврат каретки в конце строки. Возможно, вам это не видно, но оно есть; он будет отображаться как ^ M при перенаправлении на cat -e . Затем вы должны приложить дополнительные усилия, чтобы этот управляющий код не был назначен вашим переменным, особенно если вы собираетесь вставить этот вывод в базу данных.
  • Также существует риск того, что программы сочтут, что они могут отображать вывод, который не подходит для перенаправления файлов. Обычно, если вы перенаправляете STDOUT в файл, программа распознает, что ваш STDOUT не является терминалом, и пропускает любые цветовые коды. Если перенаправление STDOUT происходит от вывода ssh-клиента и существует PTY, связанный с удаленным концом клиента, удаленные программы не смогут сделать такое различие, и вы получите мусор терминала в ваш выходной файл. Перенаправление вывода в файл на удаленном конце соединения должно работать должным образом.

Вот тот же тест bash, что и раньше, но для STDOUT:

# fd 1 is STDOUT
[ -t 1 ]; echo $?

Хотя это можно обойти проблемы, вы неизбежно забудете создавать сценарии на их основе. Все мы в какой-то момент понимаем. Члены вашей команды могут также не осознавать / помнить, что этот псевдоним существует, что, в свою очередь, создаст для вас проблемы, когда они напишут сценарии, использующие ваш псевдоним.

Псевдоним ssh to ssh -t в значительной степени тот случай, когда вы нарушите принцип наименьшее удивление ; люди будут сталкиваться с проблемами, которых они не ожидают, и могут не понимать, что их вызывает.

Вот тот же тест bash, что и раньше, но для STDOUT:

# fd 1 is STDOUT
[ -t 1 ]; echo $?

Хотя эти проблемы можно обойти, вы неизбежно забудете разрабатывать сценарии на их основе. Все мы в какой-то момент понимаем. Члены вашей команды также могут не осознавать / помнить, что этот псевдоним существует, что, в свою очередь, создаст для вас проблемы, когда они напишут сценарии, использующие ваш псевдоним.

Псевдоним ssh to ssh -t в значительной степени тот случай, когда вы нарушите принцип наименьшее удивление ; люди будут сталкиваться с проблемами, которых они не ожидают, и могут не понимать, что их вызывает.

Вот тот же тест bash, что и раньше, но для STDOUT:

# fd 1 is STDOUT
[ -t 1 ]; echo $?

Хотя эти проблемы можно обойти, вы неизбежно забудете разрабатывать сценарии на их основе. Все мы в какой-то момент понимаем. Члены вашей команды также могут не осознавать / помнить, что этот псевдоним существует, что, в свою очередь, создаст для вас проблемы, когда они напишут сценарии, использующие ваш псевдоним.

Псевдоним ssh to ssh -t в значительной степени тот случай, когда вы нарушите принцип наименьшее удивление ; люди будут сталкиваться с проблемами, которых они не ожидают, и могут не понимать, что их вызывает.

Все мы в какой-то момент понимаем. Члены вашей команды также могут не осознавать / помнить, что этот псевдоним существует, что, в свою очередь, создаст для вас проблемы, когда они напишут сценарии, использующие ваш псевдоним.

Псевдоним ssh to ssh -t в значительной степени тот случай, когда вы нарушите принцип наименьшее удивление ; люди будут сталкиваться с проблемами, которых они не ожидают, и могут не понимать, что их вызывает.

Все мы в какой-то момент понимаем. Члены вашей команды также могут не осознавать / помнить, что этот псевдоним существует, что, в свою очередь, создаст для вас проблемы, когда они напишут сценарии, использующие ваш псевдоним.

Псевдоним ssh to ssh -t в значительной степени тот случай, когда вы нарушите принцип наименьшее удивление ; люди будут сталкиваться с проблемами, которых они не ожидают, и могут не понимать, что их вызывает.

73
ответ дан 28 November 2019 в 19:30

Подумайте об обратной совместимости.

Два основных режима ssh - интерактивный вход с tty и указанная команда без tty, потому что это были точные возможности rlogin и rsh соответственно. ssh должен был предоставить расширенный набор функций rlogin / rsh , чтобы быть успешной в качестве замены.

Таким образом, значения по умолчанию были определены до того, как появился ssh. Комбинации типа «Я хочу указать команду и получить tty» должны быть доступны с новыми параметрами. Радуйтесь, что по крайней мере у нас есть эта опция, в отличие от того, когда мы использовали rsh . Мы не отказались от каких-либо полезных функций для получения зашифрованных соединений. У нас есть бонусные функции!

1
ответ дан 28 November 2019 в 19:30

Из man ssh :

 -t      Force pseudo-tty allocation.  This can be used to execute arbi-
         trary screen-based programs on a remote machine, which can be
         very useful, e.g. when implementing menu services.  Multiple -t
         options force tty allocation, even if ssh has no local tty.

Это позволяет вам получить своего рода «оболочку» для удаленного сервера. Для серверов, которые не предоставляют доступ к оболочке, но разрешают SSH (например, Github - известный пример доступа по SFTP), использование этого флага приведет к тому, что сервер отклонит ваше соединение.

В оболочке также есть все ваши переменные среды (например, $ PATH ), поэтому для выполнения скриптов обычно требуется tty для работы.

0
ответ дан 28 November 2019 в 19:30

Экранирующие символы SSH и передача двоичных файлов

Одно из преимуществ, которое не было упомянуто в других ответах, заключается в том, что при работе без псевдотерминала, такие экранирующие символы SSH ~C, как ~C, не поддерживаются ; это делает безопасным передачу программ двоичных файлов, которые могут содержать эти последовательности.

Доказательство концепции

Скопировать двоичный файл с помощью псевдотерминала:

$ ssh -t anthony@remote_host 'cat /usr/bin/free' > ~/free
Connection to remote_host closed.

Скопировать двоичный файл без использования псевдотерминала:

$ ssh anthony@remote_host 'cat /usr/bin/free' > ~/free2

Два файла не одно и то же:

$ diff ~/free*
Binary files /home/anthony/free and /home/anthony/free2 differ

Повреждён тот, который был скопирован с помощью псевдотерминала:

$ chmod +x ~/free*
$ ./free
Segmentation fault

а другой нет:

$ ./free2
             total       used       free     shared    buffers     cached
Mem:       2065496    1980876      84620          0      48264    1502444
-/+ buffers/cache:     430168    1635328
Swap:      4128760        112    4128648

Передача файлов по SSH

Это особенно важно для таких программ, как scp или rsync, которые используют SSH для передачи данных. Это подробное описание того, как работает протокол SCP объясняет, как протокол SCP состоит из смеси текстовых сообщений протокола и данных двоичного файла.


OpenSSH помогает защитить вас от себя

Стоит отметить, что даже если используется флаг -t, клиент OpenSSH ssh откажется выделять псевдотерминал, если обнаружит, что его поток stdin не является терминалом:

$ echo testing | ssh -t anthony@remote_host 'echo $TERM'
Pseudo-terminal will not be allocated because stdin is not a terminal.
dumb

Вы всё равно можете заставить клиента OpenSSH выделить псевдотерминал с помощью -tt:

$ echo testing | ssh -tt anthony@remote_host 'echo $TERM'
xterm

В любом случае, его (разумно) не волнует, если stdout или stderr будут перенаправлены:

$ ssh -t anthony@remote_host 'echo $TERM' >| ssh_output
Connection to remote_host closed.
33
ответ дан 28 November 2019 в 19:30

На удаленном хосте мы имеем дело с этой настройкой:

/etc/sudoers
...
Defaults requiretty

Без sudo

$ ssh -T user@host echo -e 'foo\\nbar' | cat -e
foo$
bar$

И с sudo

$ ssh -T user@host sudo echo -e 'foo\\nbar' | cat -e
sudo: sorry, you must have a tty to run sudo

С sudo мы получаем дополнительный возврат каретки

$ ssh -t user@host sudo echo -e 'foo\\nbar' | cat -e
foo^M$
      bar^M$
            Connection to localhost closed.

решение - отключить перевод новой строки в перевод каретки-новую строку с помощью stty -onlcr

$ ssh -t user@host stty -onlcr\; sudo echo -e 'foo\\nbar' | cat -e
foo$
    bar$
        Connection to localhost closed.
4
ответ дан 28 November 2019 в 19:30

Теги

Похожие вопросы