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.