Readlink не работает над ssh

348
Typhon

Я пытаюсь отправить команду bash через SSH, используя ssh -q $REMOTE -x "command". Потому что у меня есть несколько команд bash, я использую << EOF.

Проблема в том, что команда readlink возвращает мне пустую строку, когда я присваиваю ее результат переменной. Когда я звоню прямо, это не так.

Вот упрощенная версия моего кода:

ssh -q $REMOTE -x << EOF LINK="/path/to/my/link" # the link points to /path/to/my/file readlink $LINK # outputs /path/to/my/file TEST=$(readlink -f "$LINK") echo $TEST # outputs an empty string EOF 

В этот момент я поместил тот же код в сценарий оболочки на удаленной машине и попытался вызвать сценарий оболочки:

# local machine ssh -q $REMOTE -x << EOF ./test-script EOF 
# remote machine "test-script" LINK="/path/to/my/link" # the link points to /path/to/my/file readlink $LINK # outputs /path/to/my/file TEST=$(readlink -f "$LINK") echo $TEST # outputs /path/to/my/file 

Вдруг это работает, когда я вызываю удаленный скрипт, все работает нормально, но почему он не работает через ssh?

0
Примечание: [Существуют ли соглашения об именовании переменных в сценариях оболочки?] (Https://unix.stackexchange.com/a/42849/108618) Kamil Maciorowski 5 лет назад 0

2 ответа на вопрос

2
Lewis M

В этом документе ваши переменные оцениваются на стороне источника. Если вы хотите, чтобы ваши переменные оценивались на целевой стороне, экранируйте $. Например,

ssh -q $REMOTE -x << EOF LINK="/path/to/my/link" readlink \$LINK TEST=\$(readlink -f "\$LINK") echo \$TEST EOF 

Надеюсь это поможет

0
Kamil Maciorowski

Из справочного руководства Bash :

Формат здесь-документов:

[n]<<[-]word here-document delimiter 

Если какая-либо часть слова заключена в кавычки, разделитель является результатом удаления кавычки для слова, и строки в документе здесь не раскрываются. Если слово в кавычках, все линии здесь-документа подвергаются параметр расширения, подстановки команд и арифметических выражений, последовательность символов \newlineигнорируется, и \должны быть использованы для цитирования символов \, $и `.

Так что либо убегайте $(как говорит другой ответ ), либо используйте << "EOF"(с кавычками); в противном случае синтаксис, как $variableи $(…)будет решаться локально.

Похожие вопросы