Executando comando remoto com ssh obtendo “bash: / dev / fd / 63: Nenhum arquivo ou diretório desse tipo”

6

Eu tenho /root/test.sh em um servidor remoto, que tem o seguinte conteúdo:

#!/bin/bash
date

No servidor remoto, recebo a seguinte saída:

# ./test.sh
Fri Dec 18 07:41:10 EST 2015

# bash <(cat /root/test.sh)
Fri Dec 18 07:41:23 EST 2015

No entanto, se eu tentar executar os mesmos comandos da minha máquina local, recebo o seguinte resultado:

$ ssh root@remote_server /root/test.sh
Fri Dec 18 07:44:32 EST 2015

$ ssh root@remote_server bash <(cat /root/test.sh)
cat: /root/test.sh: No such file or directory
bash: /dev/fd/63: No such file or directory

Então, qual é o problema da última corrida? Você pode achar estranho executar um script como este bash <(cat /root/test.sh) . A razão pela qual fiz isso é porque é uma versão simplificada da minha situação real. Meu código real é baixar um script Bash da Internet e executá-lo localmente. Eu tenho muitas máquinas para rodar, com parâmetros diferentes, então estou tentando executá-las no meu computador local.

    
por Elgs Qian Chen 18.12.2015 / 13:26

2 respostas

13

Você não pode passar descritores de arquivo como este sobre ssh . A construção <(...) cria arquivos virtuais em seu sistema e não tem significado ao executar no sistema remoto.

Se você realmente quiser usá-lo, coloque-o nas aspas, o que irá avaliar no sistema remoto, se você tiver bash lá

ssh root@remote_host "bash <( cat /root/test.sh )"
    
por 18.12.2015 / 14:10
4

Minha sugestão é fazer um script no host remoto ( /root/test.sh ) para torná-lo executável ( chmod u+x /root/test.sh ) e executar da seguinte maneira

ssh root@remote_server /bin/bash -c  /root/test.sh

Sobre /bin/bash: /dev/fd/63: No such file or directory
Você pode ler as razões nesta resposta [ 1 ] .

Nota:
Use o bom hábito de usar o caminho completo ( /bin/bash ) em vez de apenas o nome do comando ( bash ) para evitar riscos de segurança desnecessários [ 2 ] .

Outro caminho deve ser

ssh root@remote_server << EOF
cat  /root/test.sh
# whatever else
EOF

Ele irá executar cada linha até o segundo EOF ... você pode fazer suas variantes sobre isso ...

    
por 18.12.2015 / 14:08