Скрипт оболонки з локальної машини для виконання команди на віддаленій машині, а потім продовжуйте на локальній машині


10

Проблема така: я хочу скопіювати файли з віддаленої машини.

Я шукаю спосіб написати скрипт оболонки, який би з'єднався з віддаленою машиною, отримав розташування збереженого файлу, як тільки я отримаю відключення розташування від віддаленого сервера і використовую scp з локальної машини з отриманим місцем для скопіюйте файл.

Зокрема, я хочу знати, як із сценарію я би підключився до віддаленої машини, робив завдання на цій машині. Відключіть і продовжуйте виконання локально.

Відповіді:


15

Рішення 1:

remote_output="$(ssh user@host "remote command")"
scp "user@$host:$remote_output" /local/path

Це працює, підключившись до віддаленої машини, запустивши деякі команди та скопіювавши результат на змінну на локальній машині. Скажімо, віддалено повторюючи шлях до файлу, захоплюючи його локально.

Рішення 2:

ssh user@host "determine_path; cat filename" >local_filename

Це працює, знаходячи та виводячи файл безпосередньо з віддаленого та перенаправляючи його на файл локально. Це пропускає scp. Це вимагає, щоб кроки до "cat" не мали результату (який ви можете вирішити за допомогою &> / dev / null).


1
+1 - показує, як вирішити всю проблему одним з'єднанням, а не окремим ssh + scp.
Пітер Кордес

Усі відповіді корисні, але ця конкретно стосується моєї проблеми
gnsr

20

Ви можете написати сценарій у такому форматі:

command1
command2
...
ssh user@machine command3
...
command4
command5

Вам потрібно налаштувати SSH-ключі, щоб command3виконати їх, не вимагаючи введення пароля.


2
слід зазначити, що це буде синхронно. Поки ssh user@remote command3працює, command4не можу почати
aaaaa каже відновити Моніку

3
@aaaaaa, якщо ви цього не зробилиssh user@machine command3 &
Ісаак

3
@Isaac так, моя думка полягає в тому, що будь-яка поведінка може бути бажаною, але це має бути чітке рішення
aaaaa каже відновити Моніку

2

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

Крім того, я також припускаю, що ці команди друкують на стандартному виході повний шлях до файлу або відносний шлях до файлу щодо домашнього каталогу користувача SSH, який використовується для копіювання. У моєму прикладі назва скрипту - "getfilepath.sh", хоча він не повинен бути сценарієм оболонки, це може бути якийсь інший виконуваний файл або навіть ряд команд.

# Script to be executed on local machine.

# put any leading local commands here.

FILE=$(ssh user@emote getfilepath.sh);
scp user@remotehost:"$FILE" .

# put any trailing local commands here.

У наведеному вище коді позначення "$ ()" - це спосіб захоплення стандартного виводу команди як змінної оболонки. Це досить стандартно, але якщо ви використовуєте оболонку, яка не розуміє її, ви можете замість цього оточити команду "back-ticks", які є знаками наголосу зліва від клавіші 1 на більшості американських клавіатур.


0

можливо, можна запустити заплановану задачу на віддаленій машині, яка виконує всю роботу.

Це не дозволить вам підключитися до віддаленої машини під час пошуку місця розташування файлів, які ви хочете скопіювати.

Я роблю це:

рядок comand запускає заплановане завдання, яке виконує пакетний сценарій у моєму випадку.

schtasks /run /s remoteserver /u %user% /p %password% /tn "scheduledtaskname"

З повагою

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