Substituição de comando semelhante ao Bash no ssh ou Como solicitar coisas do ssh *client*?

Substituição de comando semelhante ao Bash no ssh ou Como solicitar coisas do ssh *client*?

No bash (e em outros shells) é possível inserir o resultado de um comando em uma linha de comando usando algo como $() e `` (crases).

Agora seria bom se você tivesse algo assim, mas para sessões ssh. Então você está em uma sessão ssh e precisa de algumas informações do seu próprio computador e deseja colocá-las na linha de comando interna da máquina à qual está conectado.

Por exemplo, digamos que você queira acessar diretamente um console mysql. Você poderia usar um comando como esse:

ssh [email protected] "mysql -u blub -pmypass"

Isso funciona, mas o problema é que você pode ver a senha na linha de comando do processo shell ssh.

Para resolver este problema de segurança eu gostaria de ter algo assim:

ssh [email protected] "mysql -u blub -p\$(ssh-on-client 'cat pass-file')"

que seria executado cat passfileno cliente ssh e não no servidor. Existe algo assim conhecido? Você tem algum outro truque para fazer isso?

ATUALIZAÇÃO: Agradeço respostas que se referem ao meu exemplo, mas não as aceitarei a menos que respondam à verdadeira pergunta. Ou seja, se é possível comunicar-se com o computador cliente ssh a partir de uma sessão ssh. (Eu sei que isso pode constituir um possível problema de segurança)

Soluções possíveis:

  • Ter um servidor ssh no cliente para conectar-se novamente. (sweimann) O problema é como obter as credenciais para conectar-se novamente ao servidor.
  • Criando um túnel com ssh e usando algum script netcat/telnet para executar comandos no servidor e enviar o resultado de volta.
  • Use expect para criar o script do shell. (Zac Thompson)
  • Use um wrapper personalizado em torno do ssh no cliente que observa o console e toma as medidas adequadas. (sapporo)
  • Patch SSH para suportar isso. Existe um patch semelhante na lista de discussãodisponível.
  • Existe uma opção 'SendEnv' parasshque define variáveis ​​de ambiente no computador remoto. No entanto, isso deve ser ativado no sshd remoto.

Responder1

Você quer usaresperarpor esta. Provavelmente já está na sua máquina. É a ferramenta padrão para qualquer tipo de automação interativa de linha de comando. É uma biblioteca Tcl, então você obterá algumas habilidades em Tcl gratuitamente. Cuidado; é viciante.

#!/path/to/expect
spawn ssh [email protected] "mysql -u blub"
expect "*ssword:*"
send -- "mypass\r"
interact

Responder2

Tente usar um <.

ssh[e-mail protegido]"mysql -u blub -p" <arquivo

Se a primeira linha em "arquivo" for sua senha, ele "deveria" usá-la para o prompt de senha, então o restante será usado para a parte sql.

Se você estiver simplesmente executando um arquivo sql no servidor remoto, tente:

ssh[e-mail protegido]"mysql -u blub -p <arquivo.sql" <senha

Responder3

Tenho investigado o problema subjacente há alguns anos. Eu queria acionar um download de SCP de dentro de uma sessão SSH. Assim como o seu problema, isso requer comunicação de dentro da sessão SSH com algum processo no cliente.

Então aqui está uma terceira solução possível: Conecte-se usando um wrapper em torno do SSH, que verifica a saída do SSH e aciona determinados comandos localmente quando reconhece um padrão. É claramente um hack, mas pode funcionar.

Acabei com uma versão modificada de /usr/bin/script que lembraria minha conexão SSH (por exemplo me@somehost), e sempre que minha sessão ssh fosse impressa ###/some/absulte/path/to/file/on/host.txt###, ela seria executada localmentescp me@somehost:/some/absulte/path/to/file/on/host.txt .

Um script de shell simples foi usado para produzir convenientemente o padrão e o caminho absoluto no servidor.

(Na verdade, meu código fez um pouco mais: ele abriu um editor de texto local no arquivo baixado e o reenviou usando SCP quando o arquivo foi modificado. Deixe-me saber se você deseja o código.)

Tenho procurado uma implementação melhor disso desde então, mas não encontrei uma até agora.

Talvez essa técnica pudesse ser implementada como um comando de proxy SSH (pense em connect.c) em vez de um wrapper em torno do SSH.

Responder4

Você tem que emular a sessão do terminal:

ssh -t [email protected] "mysql -u blub -p"

Neste caso, será solicitada a senha que percorre a rede através do canal ssh criptografado e não será exibida no console.

informação relacionada