2010-11-03 3 views
2

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

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

ssh [email protected] "rsync localserver:script.sh ./; ./script.sh; rm script.sh" 

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

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

ответ

9

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

ssh -T [email protected] <script.sh 

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

+0

приятно! только то, что я хочу, за исключением того, что он возвращает «Псевдо-терминал не будет выделен, потому что stdin не является терминалом»; вы знаете, почему и как я могу избавиться от этого? –

+0

Возможно, я над сложным, что немного потом ... – Flexo

+0

@David - см. Править. – eduffy

1

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

test.sh:

#!/bin/bash 

echo "test" 

Труба для удара по удаленной машина:

[email protected]:/tmp > cat test.sh | ssh [email protected] "cat | bash" 
test 
+1

Ненужное использование кошки. – Sorpigal

+0

@Sorpigal, что вы подразумеваете под ненужным? –

+3

«cat | bash» можно заменить на «bash -», а «cat test.sh» можно реализовать с помощью Flexo

3

Всегда есть способ.

ssh [email protected] 'sh -' < script.sh 
+0

отлично. это позаботится об ошибке, возвращенном, не используя «sh-» ... знаете ли вы, почему? –

+0

Я не могу с уверенностью сказать вам, в чем отличия. – Sorpigal

1

другой вариант ответа на @Sorpigal

ssh [email protected] 'bash -s' < script.sh 
+0

'' bash -'' тоже будет работать, похоже, похоже, что он предназначен для этого. – Sorpigal

+0

почему голос? –

0
ssh -T [email protected] < script.sh 
# "Pseudo-terminal will not be allocated because stdin is not a terminal." 

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

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

ssh localhost <<<'echo Hello, world!' 
ssh localhost sh <<<'echo Hello, world!' 
ssh -T localhost <<<'echo Hello, world!' 
Смежные вопросы