Як написати скрипт bash, який входить на іншу машину, щоб робити речі?


11

Чи можна написати сценарій bash, що

  1. буде запущено з машини A, увійде на іншу машину B за допомогою ssh (обидві машини A і B були б Linux-Machines),
  2. копіює деякі файли на машині B
  3. запускає скрипт python заданим сценарієм python на цих машинах.
  4. передає результати назад на машину A
  5. виходить з машини B.

Це технічно можливо?

Відповіді:


15

Звичайно, це можливо:

scp file user@host:
ssh user@host path_to_script
scp user@host:file_to_copy ./

і це все...

Але є одна проблема: вам буде запропоновано пароль три рази. Щоб уникнути того, що ви можете генерувати ssh-ключі та авторизувати користувачів цими ключами.

Щоб генерувати ключі ssh ssh-keygen -t rsa, відповідайте на запитання та копіюйте відкритий ключ у віддалений хост (машина B) у ~/.ssh/authorized_keysфайл. Приватний ключ слід зберегти ~/.ssh/id_rsaна локальній машині (A).


Якщо відкриті ключі не є варіантом, ви можете зробити щось необмежене, щоб мінімізувати підказки пароля, наприкладcat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
Патрік

Якщо ви хочете використовувати пароль, ви завжди можете використовувати пул з'єднань OpenSSH, визначивши ControlMaster=yesта ControlPath=/path/to/socketfile, а потім запустити одне ssh-з'єднання, -fщоб запустити фоновий ssh. Повідомте всім наступним з'єднанням SSH використовувати той самий файл сокета.
jsbillings

4

Я можу зробити все за одне sshз'єднання / сеанс:

ssh user@host "cat > remote_dst; command; cat remote_src" < local_src > local_dst

Це:

  1. Копії local_srcз remote_dst,
  2. Виконує command,
  3. Копії remote_srcдо local_dst.

Але якщо писати commandдалі stdout, результат з також буде в local_dst. Якщо commandзчитує вхід з stdin, він отримає і EOF.


3

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

Найпростіший спосіб вирішити це завдання - запустити окремі сеанси SSH для трьох операцій:

rsync -a inputs/ machineB:inputs/
ssh machineB 'some command -i inputs -o outputs'
rsync -a machineB:outputs/ outputs/

Для цього потрібна тричі автентифікація на machineB. Рекомендований спосіб уникнути багаторазової автентифікації - це використання засобу спільного доступу в сучасних версіях OpenSSH: запустити головне з'єднання з B раз і назавжди, а SSH автоматично підключити до цього головного з'єднання. Додайте ControlMaster autoі ControlPathрядок до свого~/.ssh/config , а потім запустіть основне з'єднання у фоновому режимі, після чого виконайте свої завдання.

ssh -fN machineB                         # start a master connection in the background
# Subsequent connections will be slaves to the existing master connection
rsync -a inputs/ machineB:inputs/
ssh machineB 'some command -i inputs -o outputs'
rsync -a machineB:outputs/ outputs/

Замість того, щоб використовувати scp або rsync для копіювання файлів, монтувати віддалену файлову систему під SSHFS може бути простіше . Це дозволить встановити головне з'єднання, до речі (якщо ви налаштували, ~/.ssh/configяк зазначено вище).

mkdir /net/machineB
sshfs machineB: /net/machineB
cp -Rp inputs /net/machineB/
ssh machibeB 'some command -i inputs -o outputs'
cp -Rp /net/machineB/outputs .
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.