Enviando comandos do terminal via conexão SSH: Canais aninhados

0

Hoi todo mundo,

Atualmente, estou tendo problemas para enviar comandos por SSH via linha de comando para um servidor. Para ter um exemplo fácil, eu sempre envio o comando "pwd" - que deve retornar a pasta atual em que você está.

Eu construo a conexão SSH inicial com sucesso com o seguinte comando:

sshg3 user@server#port 'pwd'

que se conecta ao servidor e encurta a pasta pessoal.

Depois, eu uso sudo su - user2 - porque o usuário tem mais direitos como usuário (necessário para tarefas específicas):

sshg3 user@server#port "echo pwd|sudo su - user2"

Aqui, no entanto, se eu quiser concatificar vários comandos um após o outro, eu preciso inserir "" - caso contrário, não funciona:

sshg3 user@server#port "echo ""pwd;pwd""|sudo su - user2"

Se eu não tiver ou apenas um ", o resultado é:

pwd
-bash: line 1: {homefolder}: is a directory

Agora, depois de usar o lftp, preciso fazer o upload de dados para esse servidor usando outro usuário. Usando outro pipe, eu uso isso com um único comando da seguinte maneira:

sshg3 user@server#port "echo ""echo pwd|lftp -u user3 -p 1234 server2""|sudo su - user2"

E agora vem o problema: Enviar vários comandos para o segundo servidor não funciona. Se eu usar o mesmo padrão que usei antes (""), obtive este resultado:

sshg3 user@server#port "echo ""echo ""pwd;pwd""|lftp -u user3 -p 1234 server2""|sudo su - user2"

Isto imprime:

echo pwd
bash: pwd|lftp -u user3 -p 1234 server2: command not found

A maior parte eu comecei usando a resposta em [this] [1] thread - mas agora estou preso.

Alguém pode me ajudar com isso?

    
por bublitz 24.08.2018 / 11:11

2 respostas

0

Não sei exatamente o que você está tentando fazer no servidor remoto. Parece que você quer executar comandos que dependem da resposta de outros comandos (como pwd , que imprime o diretório de trabalho). Possivelmente você também quer usar uma senha ("echo pwd") para su , não tenho certeza de qual.

Eu sugeriria uma das seguintes abordagens:

  • Escreva um script no servidor remoto que faça o que você deseja. Execute esse script via ssh . Dê ao script informações adicionais, como senhas, como argumentos ao chamá-lo.

  • Se você não puder armazenar o script no servidor remoto permanentemente: Escreva o script de qualquer maneira e, em seguida, canalize e execute todo o script por meio de ssh .

  • Use expect para fazer o script de uma sessão interativa complicada via ssh , onde você chama vários programas, que por sua vez esperam a entrada do usuário.

De qualquer forma, acho que você não vai ficar muito confuso com echo .

    
por 24.08.2018 / 12:55
0

Acho que você tem um problema XY . Se você pudesse nos dizer o que está tentando alcançar, em vez de como você está tentando alcançá-lo, provavelmente poderíamos ajudar ...

Enquanto isso, como não posso ajudar com seu problema original, vamos abordar o seguinte:

sshg3 user@server#port "echo ""echo ""pwd;pwd""|lftp -u user3 -p 1234 server2""|sudo su - user2"

O Bash vai dividir isso em argumentos baseados em espaço em branco sem aspas, portanto, os argumentos são:

  1. sshg3
  2. user@server#port
  3. "echo ""echo ""pwd;pwd""|lftp -u user3 -p 1234 server2""|sudo su - user2"

Após a remoção da citação do argumento 3, será assim: (Eu não acho que é isso que você pretendia)

echo echo pwd;pwd|ltfp -u user3 -p 1234 server2|sudo su - user2

Você pode confirmar isso com o seguinte snippet.

Coloque seu comando na matriz com X=( YOUR_COMMAND ) :

$ X=(sshg3 user@server#port "echo ""echo ""pwd;pwd""|lftp -u user3 -p 1234 server2""|sudo su - user2")
$ for i in "${X[@]}"; do echo "${i}"; done
sshg3
user@server#port
echo echo pwd;pwd|lftp -u user3 -p 1234 server2|sudo su - user2

A versão limpa do argumento 3 será passada para o sistema remoto e será (provavelmente) interpretada da seguinte forma:

  • Argumentos do Command 1:

    1. echo
    2. echo
    3. pwd
  • Argumentos do comando 2: ( stdout ligado ao comando% s stdin do comando 3 / | )

    1. pwd
  • Argumentos do Comando 3: ( stdout conectado ao comando stdin do Command 4)
    1. lftp
    2. -u
    3. user3
    4. -p
    5. 1234
    6. server2
  • Argumentos do Command 4:
    1. sudo
    2. su
    3. -u
    4. user2

Novamente, você pode confirmar isso efetuando login e executando a terceira linha limpa do shell remoto.

Há algumas coisas a serem notadas sobre isso:

  • Você provavelmente não quis fazer eco do echo pwd para o stdout (que é o que o Comando 1 fará)
  • lftp não espera que um caminho absoluto (e nada mais) seja fornecido em stdin
  • su muito provavelmente não esperará que a saída de lftp seja dada em stdin ... su invocará o shell de user2 .
por 24.08.2018 / 13:13