Readlink não está funcionando com o ssh

0

Estou tentando enviar um comando bash sobre SSH usando ssh -q $REMOTE -x "command". Porque eu tenho vários comandos bash, estou usando << EOF.

O problema é que o comando readlink me retorna uma string vazia quando atribuo seu resultado a uma variável. Quando eu chamo diretamente, não é.

Aqui está uma versão simplificada do meu código:

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

Nesse ponto, coloquei o mesmo código em um script de shell na máquina remota e tentei chamar o script de shell:

# 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

De repente está funcionando, quando estou chamando o script remoto, tudo funciona bem, mas por que não está funcionando com o ssh?

Typhon
fonte

Respostas:

2

Dentro do documento aqui, suas variáveis ​​estão sendo avaliadas no lado da fonte. Se você quer que suas variáveis ​​sejam avaliadas no lado do alvo, escape do $. Por exemplo,

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

Espero que isto ajude

Lewis M
fonte
0

De Manual de Referência Bash :

O formato dos documentos aqui é:

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

Se alguma parte de palavra é citado, o delimitador é o resultado da remoção de cotação em palavra e as linhas no documento here não são expandidas. E se palavra é sem aspas, todas as linhas do aqui-documento são submetidas à expansão de parâmetros, substituição de comando e expansão aritmética, a sequência de caracteres \newline é ignorado e \ deve ser usado para citar os caracteres \, $e `.

Então, ou escape $ (gostar esta outra resposta diz) ou usar << "EOF" (com aspas); caso contrário sintaxe como $variable e $(…) será resolvido localmente.

Kamil Maciorowski
fonte