Как запускать команды в пакетном режиме через ssh?

9

Как я могу запускать команды в пакетном режиме через SSH? То есть, что является sshэквивалентом команды sftp -b <filename> <hostname>?

У меня есть набор команд, которые я хочу запустить через набор хостов, соединяющихся через ssh. Более того sftp, я сохраняю команды в файле, filenameподключаюсь к хосту и запускаю команды, используя ранее упомянутую команду.

Возможно ли что-то подобное закончиться ssh?

Srikanth
источник
Я прошел через этот вопрос. Но я так и не смог разобраться, как запускать команды в пакетном режиме.
Срикант
И кто-нибудь может создать тег #batchmode и пометить этот вопрос к этому?
Срикант

Ответы:

9

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

#!/bin/sh
trap "rm -f /tmp/sendonssh.$$.*" 0 1 2 3 15
# commands to run on the remote server
cat <<'EOF' >> /tmp/sendonssh.$$.sh
mkdir -p /tmp/foobar.$$
mv $HOME/xyzzy /tmp/foobar.$$
chmod 640 $HOME/xyzzy
EOF
# call for each argument
for userhost in "$@"; do
    errorout=`ssh -aTxo BatchMode=yes $userhost /bin/sh -s < /tmp/sendonssh.$$.sh 2>&1`
    rc=$?
    if [ $rc -ne 0 ]; then
        echo "Error: $userhost: $errorout"
        exit $rc
    fi
done

Я делаю это с некоторым «удаленным выполнением» приложение в моей тестовой среде с использованием Python вместо оболочки: ssh $userhost python < $pythonscriptfilename.

Arcege
источник
Спасибо за ответ. Это выглядит так. Я немного его подправил и сейчас попробую.
Срикант
7

Эквивалент SSH sftp -b <filename> <hostname>будет:

ssh -o BatchMode=yes <hostname> sh -s < "<filename>"

MattBianco
источник
3

Как насчет простоты и запуска «пакетного» файла на другом компьютере?

  1. пакетный файл scp user @ pc
  2. ssh user @ pc batch-file
  3. ssh user @ pc rm batch-file

И командный файл будет обычным сценарием оболочки, поэтому синтаксис хорошо известен.

Johan
источник
0

man expect? : \

но это не идеальный способ.

LanceBaynes
источник
Привет johnny8888, я на сервере Solaris, и нет никакого ручного ввода для ожидаемого. Можете ли вы разработать свой ответ?
Срикант
@Srikanth linux.die.net/man/1/expect
Майкл
@Srikanth: expectпредназначен для взаимодействия с программами, которые ожидают запуска на терминале. Это не связано с проблемой запуска команд через ssh.
Жиль "ТАК - перестань быть злым"
0

возможно

ssh user@host sh -c "$(<filename)"
Гленн Джекман
источник
0

Вы можете использовать принудительные команды SSH.

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

Фахим Митха
источник
0

Другой вариант скрипта от Arcege - это функция Bash:

sshbatch() {
  # Expect at least 2 parameters, if less are provided print help
  if [[ ${#@} -lt 2 ]]; then
    printf 'Usage: sshbatch [user@]host... input_file\n'
  else
    while read -r -u "$fd" host; do
      # Check if the last parameter is a readable file, else print error and exit
      [[ -r ${@:(-1)} ]] || { printf "The file ${@:(-1)} is not readable!\n"; break; }
      # Run remote bash from the file given in the last parameter
      ssh -o BatchMode=yes "$host" bash -s < "${@:(-1)}"
      # Read host list from 1st to next to last parameters
    done {fd}< <(printf '%s\n' "${@:1:${#@}-1}")
  fi
}

Я не использую -Tопцию ssh , так как она работает не во всех случаях.

Этот скрипт использует расширение параметров в массиве позиционных параметров $@:

  • "${@:(-1)}" расширяется до последнего параметра (буквально сначала от конца до конца)
  • "${#@}" расширяется до количества позиционных параметров
  • "${@:1:${#@}-1}" расширяется до списка всех параметров от первого до следующего за последним (буквально число параметров меньше одного).
gadamiak
источник
Я не очень хорош в таких расширениях переменных, не могли бы вы добавить немного о том, что происходит? Приветствия.
Парень
@ Гай, вот и я - я прокомментировал код и добавил пояснения по расширению параметров
gadamiak