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

1

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

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

Por exemplo digamos que você queira acessar diretamente um console do mysql. Você poderia usar um comando assim:

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 do ssh.

Para resolver esse problema de segurança, gostaria de ter algo assim:

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

que executaria cat passfile no cliente ssh e não no servidor. Existe algo conhecido assim? Você tem outros truques como fazer isso?

ATUALIZAÇÃO: Eu aprecio as respostas que se referem ao meu exemplo, mas não as aceitarei a menos que respondam a pergunta real. Ou seja, é possível se comunicar com o computador cliente ssh de dentro 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 se conectar de volta. (sweimann) O problema é como obter as credenciais para se conectar de volta ao servidor.
  • Criando um túnel com ssh e usando algum script / telnet netcat para executar comandos no servidor e enviar o resultado de volta.
  • Use esperar para fazer o script do shell. (Zac Thompson)
  • Use um wrapper personalizado em torno do ssh no cliente, assistindo ao console e agindo de acordo. (sapporo)
  • Patch SSH para suportar isso. Existe um patch semelhante na lista de discussão disponível .
  • Existe uma opção 'SendEnv' para ssh que define variáveis de ambiente no computador remoto. Isso tem que ser ativado no sshd remoto, no entanto.
por JohannesR 10.07.2009 / 11:50

12 respostas

3

Você quer usar espera para isso. 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ê terá algumas habilidades Tcl ao longo do caminho de graça. Cuidado; é viciante.

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

Tente usar um <.

ssh [email protected] "mysql -u blub-p" < arquivo

Se a primeira linha em "file" for sua senha, "deverá" usar isso para o prompt de senha, então o restante será usado para a parte sql.

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

ssh [email protected] "mysql -u blub -p < arquivo.sql" < senha

    
por 11.07.2009 / 05:55
2

Eu tenho investigado o problema subjacente há alguns anos atrás. Eu queria acionar um download de SCP de dentro de uma sessão SSH. Como o seu problema, isso requer a comunicação de dentro da sessão SSH de volta para 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 certos comandos localmente quando reconhece um padrão. É claramente um hack, mas isso pode funcionar.

Acabei com uma versão modificada do / usr / bin / script que lembrava minha conexão SSH (por exemplo, me@somehost ), e sempre que minha sessão ssh imprimia ###/some/absulte/path/to/file/on/host.txt### , executaria localmente scp 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.

(Meu código realmente fez um pouco mais: ele abriu um editor de texto local no arquivo baixado e o enviava novamente usando o SCP quando o arquivo era modificado. Deixe-me saber se você deseja o código.)

Estou à procura de uma implementação melhor desde então, mas não encontrei nenhuma até agora.

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

    
por 14.07.2009 / 13:10
1

Para esse problema específico, talvez você possa colocar a senha em sua ~ / my .cnf arquivo no servidor?

Para sua ideia: você precisa usar o escape para fazer esse trabalho:

ssh dba@db "echo \'ssh [email protected] \"cat echofile\" \'"

Edite novamente: Você precisará de login sem senha do servidor para o cliente, ou seja, uma chave privada para a sua caixa de cliente no servidor, que é ainda menos segura que my.cnf.

    
por 10.07.2009 / 11:59
1

Você precisa emular a sessão de terminal:

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

Neste caso, você será perguntado por senha que viaja pela rede através do canal ssh criptografado e não será exibido no console.

    
por 10.07.2009 / 13:20
0

Você precisaria executar um shell primeiro, algo como

ssh [email protected] bash -c 'mysql -u user -p$(cat /root/pass_file)'
    
por 10.07.2009 / 12:00
0

Você usa ssh em vez de telnet , mas ainda envia uma senha por meio do comando, para ser executado livremente na máquina remota em texto não criptografado (visível em uma listagem ps ).

Leia este artigo do SecurityFocus sobre como proteger o MySQL .

    
por 10.07.2009 / 12:15
0

OK, eu acho que posso dizer com certeza que o que você não quer fazer não é possível de uma maneira geral, existem apenas soluções alternativas para isso que dependem do problema real que você quer resolver.

Tendo pensado nisso um pouco mais, eu resolveria o "problema de exemplo" que você deu simplesmente fazendo um redirecionamento de porta via ssh do cliente para o servidor e então usando um cliente mysql local com um my.cnf local, que na verdade é a maneira que eu sempre trabalho com o mysql.

    
por 10.07.2009 / 17:13
0

Você pode usar variáveis de ambiente em sua máquina local. Ele abriria vulnerabilidades de segurança se alguém em sua máquina local puder ver seu ambiente. e qualquer pessoa no servidor pode ver a senha.

PASSWORD=$(cat pass-file) ssh [email protected] "mysql -u blub -p$PASSWORD"
    
por 15.07.2009 / 15:39
0

Acho que, usando aspas simples, o valor da variável de ambiente será obtido da máquina remota. Assim, você pode definir PASSWORD = valor no .bashrc na máquina remota. Então, na sua máquina local, execute ssh [email protected] '. ~ / .bashrc; mysql -u blub -p $ PASSWORD '

    
por 20.07.2009 / 19:50
0

Instale o sshpass (instalação do yum)

sshpass -p password ssh [email protected]

Se você não quiser se preocupar com as chaves de impressão digital, adicione

sshpass -p senha ssh -o StrictHostKeyChecking = no [email protected]

    
por 28.09.2011 / 21:27
0

Você pode ter o bash interpretando o parâmetro como um comando e carregar sua senha antes de enviá-la por SSH

MY_PASSWORD=abcde ssh [email protected] 'echo mysql -p$MY_PASSWORD'
    
por 23.08.2012 / 23:11

Tags