Могу ли я запустить скрипт bash, который находится на моей локальной машине на удаленном сервере? - PullRequest
3 голосов
/ 03 ноября 2010

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

Мой текущий подход заключается в том, чтобы rsync-скрипт к серверу и затем запустить его:

ssh user@remoteserver "rsync localserver:script.sh ./; ./script.sh; rm script.sh"

Однако это похоже на взлом; Есть ли более удобный способ сделать это?

обновление: поскольку существует так много хороших ответов, может ли кто-нибудь помочь мне выбрать «лучший», предоставив обоснование?

Ответы [ 5 ]

10 голосов
/ 03 ноября 2010

SSH будет принимать команды от stdin

ssh -T user@server <script.sh

редактировать : -T Disable pseudo-tty allocation

3 голосов
/ 03 ноября 2010

Всегда есть выход.

ssh user@host 'sh -' < script.sh
1 голос
/ 03 ноября 2010

другая версия ответа от @ Sorpigal

ssh user@host 'bash -s' < script.sh
1 голос
/ 03 ноября 2010

Да с использованием труб:

Test.sh:

#!/bin/bash

echo "test"

Труба к bash на удаленной машине:

ajw@xxxxxxx:/tmp > cat test.sh | ssh ajw@xxxxxxxx.xxx.xx "cat | bash"
test
0 голосов
/ 09 декабря 2013
ssh -T user@server < script.sh
# "Pseudo-terminal will not be allocated because stdin is not a terminal."

Вы путаете сервер sshd, так как он предполагает, что интерактивный сеанс входа в систему с использованием stdin является терминалом - sshd выделит псевдо-tty для такого сеанса - если no указывается в качестве аргумента вашей ssh (клиентской) команды, но вместо этого sshd видит, что stdin его оболочки по умолчанию перенаправляется из файла, указанного оператором перенаправления ввода <strong><</strong>.

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

ssh localhost <<<'echo Hello, world!'
ssh localhost sh <<<'echo Hello, world!'
ssh -T localhost <<<'echo Hello, world!'
...