Сценарий оболочки с локального компьютера, чтобы выполнить команду на удаленном компьютере, а затем продолжить на локальном компьютере.

10

Проблема заключается в следующем: я хочу скопировать файлы с удаленного компьютера.

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

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

gnsr
источник

Ответы:

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не могу начать
ааааа говорит восстановить Монику
3
@aaaaaa, если вы не сделалиssh user@machine command3 &
Исаак
3
@ Исаак да, моя точка зрения такова, что любое из них может быть желательным, но это должно быть осознанное решение
ааааа говорит восстановить Монику
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.

В приведенном выше коде нотация «$ ()» представляет собой способ получения стандартного вывода команды в качестве переменной оболочки. Это довольно стандартно, но если вы используете оболочку, которая ее не понимает, вы можете вместо этого окружить команду «обратными галочками», которые являются знаками ударения слева от клавиши 1 на большинстве клавиатур США.

Джереми Импсон
источник
0

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

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

Я делаю это:

Командная строка запускает запланированную задачу, которая выполняет пакетный скрипт в моем случае.

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

С наилучшими пожеланиями

Denyo
источник