Я написал скрипт, который отлично работает при локальном исполнении:
./sysMole -time Aug 18 18
Аргументы «-time» , «Aug» , «18» и «18» успешно передаются в сценарий.
Теперь этот сценарий предназначен для выполнения на удаленной машине, но из локального каталога на локальной машине. Пример:
ssh root@remoteServer "bash -s" < /var/www/html/ops1/sysMole
Это также отлично работает. Но проблема возникает, когда я пытаюсь включить эти вышеупомянутые аргументы (время 18 августа 18) , например:
ssh root@remoteServer "bash -s" < /var/www/html/ops1/sysMole -time Aug 18 18
После запуска этого скрипта я получаю следующую ошибку:
bash: cannot set terminal process group (-1): Invalid argument
bash: no job control in this shell
Пожалуйста, скажите мне, что я делаю неправильно, это сильно расстраивает.
Ответы:
Вы были довольно близки с вашим примером. Он прекрасно работает, когда вы используете его с такими аргументами.
Пример скрипта:
Пример, который работает:
Но это не подходит для следующих типов аргументов:
В чем дело?
Проблема, с которой вы сталкиваетесь, заключается в том, что аргумент,
-time
или--time
в моем примере, интерпретируется как переход кbash -s
. Вы можете успокоитьсяbash
, прекратив его, взяв любой из оставшихся аргументов командной строки для себя, используя--
аргумент.Нравится:
Примеры
# 1:
# 2:
# 3:
# 4:
ПРИМЕЧАНИЕ: просто чтобы прояснить, что везде, где перенаправление появляется в командной строке, не имеет значения, потому что
ssh
в любом случае вызывает удаленную оболочку с конкатенацией ее аргументов, цитирование не имеет большого значения, за исключением случаев, когда вам нужно заключить цитату в удаленную оболочку как в примере № 4:источник
bash -s -- --time bye < ./ex.bash
или даже< ./ex.bash bash -s -- --time bye
. это связано с тем, что оболочка сначала выполняет инструкцию по перенаправлению (независимо от того, где она находится в команде), затем устанавливает перенаправление, а затем выполняет оставшуюся часть командной строки с перенаправлением на месте.Об обработке произвольных аргументов
Если вы действительно используете только одну строку, т.е.
-time Aug 18 18
затем вы можете просто жестко закодировать его, и существующие ответы подскажут вам, как это сделать адекватно. С другой стороны, если вам нужно передать неизвестные аргументы (например, сообщение, которое будет отображаться в другой системе, или имя файла, созданного, где конечные пользователи могут контролировать его имя), тогда потребуется больше внимания.С
bash
илиksh
как/bin/sh
Если ваш пульт
/bin/sh
предоставлен bash или ksh, вы можете безопасно выполнить следующие действия со списком ненадежных аргументов, так что даже вредоносные имена (например$(rm -rf $HOME).txt
) могут безопасно передаваться в качестве аргументов:С любым POSIX-совместимым
/bin/sh
Чтобы обезопасить себя от достаточно злонамеренных данных аргументов (пытаясь воспользоваться не-POSIX-совместимым цитированием, используемым
printf %q
в bash, когда в экранируемой строке присутствуют непечатаемые символы), даже с/bin/sh
базовым-POSIX (таким какdash
илиash
) он становится немного интереснее:Использование (для любого из вышеперечисленных)
Функции, приведенные выше, могут затем вызываться как:
...или же...
источник
скажем, аа это локальный файл, который содержит ls
$ssh servername "cat | bash" < a.a
измените 127.0.0.1 на любой ваш удаленный IP
эти два сообщения сообщают о псевдотермическом распределении, но они работают.
$ cat a.a | ssh 127.0.0.1
$ ssh 127.0.0.1 <a.a
Или же
$ cat a.a | ssh 127.0.0.1 bash or
$ ssh 127.0.0.1 bash < a.a
источник