expansão de variável dentro da substituição de comando sobre o SSH bash 4.X

3

Eu quero fazer isso ssh ${w100user}@web100 'ls -l "$(grep "${1}" /etc/pure-ftpd/pureftpd.passwd|cut -d':' -f6)"'

O que obviamente executa uma sessão ssh para o servidor web100 como w100user e depois retorna para o primeiro argumento do script "$ 1" no arquivo pureftp.passwd, pegando o 6º campo que deve ser o diretório home daquele usuário e então listará o conteúdo com uma longa listagem do diretório inicial desse usuário. Eu não consigo obter $ 1 para expandir corretamente antes na substituição de comando por SSH. Eu tentei vários métodos de citação, incluindo '$ ("$ 1" comando ...)' e neste momento é apenas adivinhação.

    
por Gregg Leventhal 19.02.2014 / 17:37

1 resposta

3

Passe-a em uma variável $LC_xxx , que é aquela com a qual o ssh geralmente passa:

LC_MY_USER=$1 ssh "${w100user}@web100" '
    ls -l "$(grep -F "$LC_MY_USER" /etc/pure-ftpd/pureftpd.passwd|cut -d: -f6)"'

Ou talvez de forma mais robusta:

LC_MY_USER=$1 ssh "${w100user}@web100" '
    ls -l -- "$(awk -F: "/\ == ENVIRON[\"LC_MY_USER\"] {print \; exit}
      " /etc/pure-ftpd/pureftpd.passwd)"'

(supondo que você queira verificar $1 em relação ao primeiro campo no arquivo de senha).

Você poderia fazer:

ssh "${w100user}@web100" '
    ls -l "$(grep -F "'"$1"'" /etc/pure-ftpd/pureftpd.passwd|cut -d: -f6)"'

para que o shell local expanda $1 , mas esteja ciente de que é potencialmente perigoso, pois é interpretado como código de shell pelo shell remoto (por exemplo, $1 sendo $(rm -rf /) ). Então você teria que sanitizar $1 primeiro.

    
por 19.02.2014 / 17:47