Как выполнить удаленную команду по ssh с аргументами?
В моем .bashrc
я определяю функцию, которую я могу использовать в командной строке позже:
function mycommand() {
ssh [email protected] cd testdir;./test.sh "$1"
}
При использовании этой команды на удаленном хосте выполняется только команда cd
; команда test.sh
выполняется на локальном хосте. Это связано с тем, что точка с запятой разделяет две разные команды: команду ssh
и команду test.sh
.
Я попытался определить функцию следующим образом (обратите внимание на одинарные кавычки):
function mycommand() {
ssh [email protected] 'cd testdir;./test.sh "$1"'
}
Я пытался сохранить команду cd
и команду test.sh
вместе, но аргумент $1
не разрешен, независимо от того, что я передаю функции. Он всегда пытается выполнить команду
./test.sh $1
на удаленном хосте.
Как правильно определить mycommand
, поэтому script test.sh
выполняется на удаленном узле после изменения в каталог testdir
, с возможностью передать аргумент, присвоенный mycommand
, на test.sh
?
Ответы
Ответ 1
Сделайте это следующим образом:
function mycommand {
ssh [email protected] "cd testdir;./test.sh \"$1\""
}
Вам все равно нужно передать всю команду как одну строку, но в этой единственной строке вам нужно иметь $1
расширенный, прежде чем он будет отправлен на ssh, поэтому вам нужно использовать ""
для него.
Update
Еще один правильный способ сделать это - использовать printf %q
для правильной цитаты аргумента. Это сделало бы аргумент безопасным для синтаксического анализа, даже если в нем есть пробелы, одинарные кавычки, двойные кавычки или любой другой символ, который может иметь особое значение для оболочки:
function mycommand {
printf -v __ %q "$1"
ssh [email protected] "cd testdir;./test.sh $__"
}
- При объявлении функции с
function
, ()
не требуется.
- Не комментируйте это только потому, что вы POSIXist.
Ответ 2
Возрождение старого потока, но этот довольно чистый подход не был указан.
function mycommand() {
ssh [email protected] <<+
cd testdir;./test.sh "$1"
+
}