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 passfile
no 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.