Я пытаюсь отправить команду 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?

2 ответа2

2

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

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

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

0

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .