Força o SSH a usar um shell específico

29

Existe alguma maneira de forçar o SSH a usar um determinado shell no terminal remoto, independentemente de qual é o shell padrão do usuário?

Eu tentei soluções semelhantes a:

ssh host.domain.com /bin/bash -c 'complicated, multi-line command'

mas infelizmente o shell padrão na extremidade remota é responsável por analisar a parte "complicada, com várias linhas de comando", e estou tendo dificuldades para escapar dela o suficiente para trabalhar tanto para os usuários de shell Bash quanto para C.

    
por plinehan 20.07.2010 / 00:51

5 respostas

7

Eu não acredito que isso seja possível, pelo menos com sistemas baseados em openssh. Se você tiver a capacidade, uma solução melhor seria inserir um arquivo de script de shell e executá-lo com o método que você publicou. Teria a vantagem de minimizar a quantidade de escape necessária, mas deixaria um arquivo para trás que teria que ser removido (talvez como a última etapa do script).

    
por 20.07.2010 / 01:00
16

Use um heredoc:

ssh host.domain.com /bin/bash << EOF
big ugly commands
lots of them
EOF
    
por 20.07.2010 / 02:43
10

Use logins baseados em chave, não baseados em senha. Então você pode adicionar uma (lista de) "comando forçado (s)" à sua chave ssh pública (no campo "options" no caso do SSH1) que está instalado no servidor (no arquivo ~ / .ssh / authorized_keys para SSH1, ~ / .ssh2 / authorization para SSH2).

Faça seu comando forçado para que seu shell desejado seja chamado ...

Mais: Você pode associar no máximo um comando forçado a uma determinada chave. Se você precisar de vários comandos forçados para diferentes propósitos, terá que configurar chaves diferentes. (Claro que você pode colocar várias coisas em um script, que você chama via comando forçado. Mas esteja ciente de que os comandos forçados são sempre executados para uma determinada conta / chave se o o usuário efetua login, independentemente de ele ter pedido algo diferente para ser executado. Se você ainda quiser honrar o comando original solicitado, dê uma olhada em como explorar a variável $SSH_ORIGINAL_COMMAND ...)

Leia sobre "comandos forçados" no Google .

    
por 02.08.2010 / 00:47
1

Surpreendentemente, vejo resultados diferentes com o seguinte:

executar no traço:

ssh [email protected] /bin/bash -c "echo <(cat)"                                              
sh: 1: Syntax error: "(" unexpected

vs bash:

ssh [email protected] '/bin/bash -c "echo <(cat)"'                                            
/dev/fd/63

A exibição do comando totalmente citado está funcionando como esperado.

    
por 06.10.2014 / 02:36
0

Eu enfrentei uma situação semelhante há algum tempo, em que precisei usar o co-processador ksh para o sqlplus e só tive um ssh através do qual as leituras e gravações devem ocorrer.

Uma maneira de fazer isso é canalizar todo o seu comando dependente em uma linha (use;) para / usr / bin / ksh na máquina remota. por exemplo:

host="user@host"

db_conn="ora_user/passwd"

a="select * from dual;"

frmt="set heading off echo off feedback off verify off pagesize 0 termout off"

var=$(ssh ${host} "echo 'sqlplus -silent /nolog |&; sql_pid=\$!; print -p \"conn ${db_conn}\"; print -p \"${frmt}\"; print -p \"${a}\"; print -p \"exit\"; wait \$sql_pid' > /remote_dir/kshcmd.txt; awk '{print \
host="user@host"

db_conn="ora_user/passwd"

a="select * from dual;"

frmt="set heading off echo off feedback off verify off pagesize 0 termout off"

var=$(ssh ${host} "echo 'sqlplus -silent /nolog |&; sql_pid=\$!; print -p \"conn ${db_conn}\"; print -p \"${frmt}\"; print -p \"${a}\"; print -p \"exit\"; wait \$sql_pid' > /remote_dir/kshcmd.txt; awk '{print \%pre%}' /remote_dir/kshcmd.txt | /usr/bin/ksh")
}' /remote_dir/kshcmd.txt | /usr/bin/ksh")
    
por 16.11.2014 / 05:41