Выполнение нескольких команд ssh с разными переключателями

Сообщение появляется в случае, если определенный процесс (в данном случае sftp-server ) не получает ЦП в течение 120 секунд (ограничение по умолчанию). Это могло быть вызвано высокой нагрузкой на систему. Обычно это может быть вызвано ожиданием любого ресурса, наиболее вероятными кандидатами являются ЦП, диск и сеть.

При отладке таких проблем вы можете проверить скорость записи на диск:

$ dd if=/dev/zero of=/tmp/output conv=fdatasync bs=384k count=1k; rm -f /tmp/output
1024+0 records in
1024+0 records out
402653184 bytes (403 MB) copied, 2753.13 s, 146 kB/s

Вы должны ожидать значения в МБ / с, например 50–230 МБ / с в зависимости от жесткого диска. В этом случае пропускная способность 146 кБ / с чрезвычайно мала и может вызывать такие сообщения ядра.

Вы также можете использовать iostat -x 5 для отслеживания использования диска.

2
19.07.2016, 17:20
2 ответа

Вам не нужно этого делать как документ ЗДЕСЬ (что и делает материал << ).

Вы можете просто выполнить ssh remotehost "command1; command2; command3"

например.

% ssh localhost "date ; uptime ; echo hello"
sweh@localhost's password: 
Tue Jul 19 08:07:48 EDT 2016
 08:07:48 up 15 days, 31 min,  3 users,  load average: 0.33, 0.33, 0.40
hello

Однако scp не так легко объединить таким образом.

Таким образом, вы можете захотеть изучить использование аутентификации с открытым ключом вместо аутентификации по паролю (также известной как «ключи ssh»). Обычно такие вещи автоматизируются.

1
29.04.2021, 00:12

Открыть SSH-соединение один раз, а затем использовать его в обратном порядке. Эта возможность OpenSSH называется мастер-соединениями. См. Использование уже установленного канала SSH

ssh_control_socket="$(mktemp)"
ssh -o ControlPath="$(ssh_control_socket)" -o ControlMaster=yes -o ControlPersist=yes administrator@host "mkdir ${DIR}"
# other commands using ssh (ssh, scp, rsync, …): pass the same ControlPath option
ssh -o ControlPath="$(ssh_control_socket)" -t administrator@host "…"
rsync -e "ssh -o 'ControlPath=$(ssh_control_socket)'" …
ssh -o ControlPath="$(ssh_control_socket)" administrator@host -O exit
rm -f "$(ssh_control_socket)"

Раздражает то, что вам нужно явно передавать параметр ControlPath при каждом вызове SSH (это имя файла, который используется для связи между каждым вызовом ssh и оригинальным клиентом SSH, который установил фактическое соединение). Здесь я передаю явное имя сокета, чтобы сценарий был самодостаточным. Если полагаться на ~/.ssh/config приемлемо, то добавьте эту строку в ~/.ssh/config:

ControlPath ~/.ssh/%l_%h_%p_%r.multiplex

Это позволит каждому SSH-клиенту проверить, есть ли существующее соединение, чтобы использовать его. Функция не будет использоваться до тех пор, пока не будет прослушиваемого главного соединения, вам все еще нужно передать -o ControlMaster=yes (или -M для краткости) при первом соединении, т.е. ваш сценарий может быть

# Open the shared connection
ssh -M -o ControlPersist=yes administrator@host :
# … all SSH-relying commands in their basic form, they will go via the shared connection …
# Close the shared connection
ssh -O exit administrator@host
3
29.04.2021, 00:12

Теги

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