Подтвердить что ты не робот

Как выполнить удаленную команду по 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?

4b9b3361

Ответ 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"
+
}