как использовать команду ssh, чтобы соединиться с несколькими компьютерами и отправить различные команды каждому компьютеры в то же время

По-моему, это называется "округление".

1
15.04.2015, 02:03
2 ответа

Попробуйте ssh -f user@host '<ваша команда здесь>'.

Со страницы man ssh:

-f Запрос ssh на переход в фоновое состояние непосредственно перед выполнением команды. Это полезно, если ssh будет запрашивать пароли или пароли, но пользователь хочет, чтобы они были в фоновом режиме.

Например, если я делаю ssh -f 'echo "hello $(pstree -p | grep sshd | wc -l) person in ssh!", он печатает hello 1 person in ssh! .

После того, как он распечатает 2, сессия автоматически завершается, но вам не нужно ждать, пока она завершится. Если я сделаю ssh -f 'sleep 30 && echo "hello $(pstree -p | grep sshd | wc -l) person in ssh!" , кажется, что ничего не случилось и я могу сделать все, что угодно, но через 30 секунд он печатает hello 1 человек в ssh! .

Используя > перенаправление перенаправит все stdout в файл, но все ошибки все равно будут распечатаны на вашем экране. Чтобы избежать этого, можно использовать &> для перенаправления всех выводимых данных, stdout и stderr, в файл.

1
27.01.2020, 23:50

SSH можно вызвать несколькими способами. Наиболее распространенный способ вызова:

ssh user@host

Открывается интерактивный терминал. Однако, SSH за кулисами на самом деле имеет стиль вызова больше похожий на:

ssh user@host /usr/bin/foo

Так что первый тип, по сути, просто соединяет и запускает bash для вас, это удобно. В основном он делает это для вас:

ssh user@host sh

Где sh - оболочка для этой системы, которая, вероятно, является bash.

В качестве аргумента предположим, что ваша команда, которую вам нужно выполнить, это mycommand.

(Причина, по которой я это упрощаю, заключается в том, что команда, которую вы привели в качестве примера, содержит nohup и выходную переадресацию, что означает, что вам нужно правильно выполнить эту команду. Также, если вы используете nohup в попытке заставить команду остаться в живых после разрыва SSH-соединения, вы, вероятно, захотите использовать setid, чтобы сделать ее лидером сеанса. В любом случае, вы также собираетесь сделать его асинхронной командой, используя и )

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

Вы не уточнили, как вы хотите это сделать. Например, машина инициирующая SSH-соединение - это та машина, которая решает, какая команда выполняется, или она указана конфигурацией на удаленной машине?

Если ваша машина инициирующая соединения с различными удаленными машинами - это та, которая должна решать, какая команда записывается, вам нужно где-то хранить эту информацию и использовать ее.

Одним из способов сделать это будет передача данных в SSH, так как по умолчанию она будет вызывать bash, который будет читать со стандартного входа:

cat command.txt | ssh user@host

Я использовал cat comand.txt в качестве примера здесь, который генерирует, какая команда должна быть отправлена в SSH, так как я понятия не имею, как вы сохраняете эту информацию прямо сейчас. Возможно, проще всего будет сохранить всю информацию в текстовом файле, например:

user  host  command
user2 host2 command2
user3 host3 command3

Теперь вы можете создать конвейер, который будет это делать, хотя это будет несколько сложно (вам придется использовать парсер типа sed или awk). Возможно, будет проще использовать легкий скриптовый язык типа Perl или PHP:

<?php

foreach (file('myfile.txt') as $line) {
    list($user, $host, $command) = explode(' ', $line);
    passthru("ssh $user@$host $command");
}
0
27.01.2020, 23:50

Теги

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