Як запускати команди в пакетному режимі над ssh?


9

Як я можу запускати команди в пакетному режимі над ssh? Тобто, що таке sshеквівалент команди sftp -b <filename> <hostname>?

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

Чи можливо щось подібне закінчилося ssh?


Я пережив це питання. Але я все одно не міг зрозуміти, як запускати команди в пакетному режимі.
Шрікант

І може хтось із них створити тег #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.


дякую за відповідь. Це схоже на це. Я трохи підлаштовую його і зараз пробую.
Шрікант

7

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

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


3

Як щодо простоти і запуску "пакетного" файлу на іншому комп'ютері?

  1. scp batch-file user @ pc
  2. bsh-файл ssh user @ pc
  3. ssh user @ pc rm batch-файл

І пакетний файл був би звичайним сценарієм оболонки, тому синтаксис добре відомий.


0

man expect? : \

але це не ідеальний спосіб.


Привіт johnny8888, я на сервері Solaris, і вручну немає запису на очікування. Чи можете ви, будь ласка, розробити свою відповідь?
Шрікант


@Srikanth: expectпризначений для взаємодії з програмами, які очікують запуску на терміналі. Це не пов'язано з проблемою виконання команд над ssh.
Жил 'ТАК - перестань бути злим'


0

Ви можете використовувати примусові команди ssh.

Вони пов'язані з певним ключем. Коли автентифікація виконується за допомогою цього ключа, ця команда запускається і з'єднання виходить. Однією з переваг такого підходу є підвищена безпека, оскільки в цьому випадку ключ не може бути використаний для отримання оболонки входу.


0

Іншим варіантом сценарію Арсеге буде функція 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}" розширюється до списку всіх параметрів від першого до наступного до останнього (буквально кількість параметрів менше одиниці).

Я не такий хороший у таких змінних розширеннях, чи зможете ви трохи додати те, що відбувається? Ура.
Хлопець

@Guy, ось ви - я прокоментував код і додав пояснення щодо розширення параметра
gadamiak
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.