Uma variável do shell é exatamente isso: uma variável do shell. O comando ssh
ou o shell iniciado por sshd
no host remoto não tem como obter acesso a essa variável do shell do cliente.
As variáveis do shell
Exportado são passadas como variáveis de ambiente para os comandos executados. Portanto, se você exportou location1
, ele seria passado como uma variável de ambiente para ssh
. Se você usou a diretiva de configuração SendEnv
ssh
(via -o
ou ~/.ssh/config
ou /etc/ssh/ssh_config
...), ssh
tentaria enviá-la para sshd
no host remoto.
No entanto, para que isso funcione, sshd
precisaria ter uma diretiva de configuração AcceptEnv
que permita receber essa variável. No entanto, geralmente não é o caso por motivos de segurança.
No entanto, muitas implementações padrão do ssh / sshd permitem a passagem de variáveis cujo nome começa com LC_
(para localização). Então você poderia aproveitar isso com:
LC_location1=$location1 LC_location2=$location2 ssh host
'su -lc '\''cp -r -- "$LC_location2" "$LC_location1"'\''
Como alternativa, você pode fazer com que o shell local expanda as variáveis na linha de comando que é passada para o shell remoto:
ssh host "su -lc 'cp -r -- $location2 $location1'"
Mas isso é o equivalente a ser executado:
eval eval "cp -r -- $location2 $location1"
Ou seja, essas variáveis não são passadas como argumentos para cp
, elas são interpretadas (duas vezes) como shell (o shell de logon do usuário remoto e o código sh
iniciado por su
), portanto, se $location1
é, por exemplo, /somewhere;rm -rf /
, que terá consequências dramáticas.
A maneira correta seria escapar adequadamente daqueles para o shell remoto. Por causa dos dois níveis de shells, você precisa escapar as aspas simples duas vezes (aqui usando ksh93
/ bash
/ zsh
syntax):
escaped_location1=\'${location1//\'/\'\\'\'}\'
escaped_location1=${escaped_location1//\'/\'\\'\'}
escaped_location2=\'${location2//\'/\'\\'\'}\'
escaped_location2=${escaped_location2//\'/\'\\'\'}
ssh host "su -lc 'cp -r -- $escaped_location2 $escaped_location1'"
Isso pressupõe que o shell de login do usuário remoto seja parecido com Bourne.