Existe alguma maneira de forçar o SSH a usar um shell específico na extremidade remota, independentemente do 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 "complicado, comando de várias linhas", e estou tendo dificuldades em evitá-lo o suficiente para funcionar tanto para usuários de shell Bash quanto C.
ssh
bash
shell
command-line-interface
plinehan
fonte
fonte
Respostas:
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 pode ser a de sftp de um arquivo de script de shell e, em seguida, executá-lo com o método que você postou. Teria a vantagem de minimizar a quantidade de escape necessária, mas deixaria um arquivo para trás que precisaria ser removido (talvez como a última etapa do script).
fonte
Use um heredoc:
fonte
cat /tmp/tempfile_containing_your_script ssh ${hostname} /bin/bash
. Portanto, em vez de uma etapa, você tem duas etapas: etapa 1 copie seu script em um arquivo, etapa 2cat
o script parassh
.Use logins baseados em chave, não com senha. Em seguida, você pode adicionar (uma lista de) "comandos forçados" à sua chave pública ssh (no campo "opções" no caso do SSH1) que está instalada no servidor (no arquivo ~ / .ssh / allowed_keys para SSH1 , ~ / .ssh2 / autorização para SSH2).
Faça seu comando forçado para que o 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, precisará configurar chaves diferentes. (É claro que você pode colocar várias coisas em um script, que você chama por comando forçado. Mas lembre-se de que comandos forçados sempre são executados para uma determinada conta / chave se o usuário efetuar login, independentemente de pedir algo diferente para executar. Se você ainda deseja honrar o comando original solicitado, veja como explorar a
$SSH_ORIGINAL_COMMAND
variável ...)Leia sobre "comandos forçados" via Google .
fonte
/etc/sshrc
.Você pode usar a
-t
opção para forçar a alocação de uma pseudo-tty para o programa que deseja iniciar, como se estivesse executando o shell padrão. Em seguida, passe o shell que você deseja como um argumento antigo simples.Com essa técnica, você pode não apenas usar qualquer shell instalado, mas também abrir o vim e outros programas que requerem um TTY, a partir de um único comando. O que é legal se você estiver escrevendo um script de shell que o conecta em algum lugar e abre um arquivo no vim, htop ou algo assim.
Não tenho certeza se esse é um shell de logon, mas há opções para fazer o bash agir como um shell de logon, portanto, seu shell pode ter isso também.
fonte
Surpreendentemente, vejo resultados diferentes com o seguinte:
executar no traço:
vs bash:
Mostrar o comando completo entre aspas está funcionando conforme o esperado.
fonte
sh -c "$*"
. Assim, você está correndosh -c "/bin/bash -c echo <(cat)"
; oecho
comando em si é o único argumento passado para-c
, e o<(cat)
é um argumento completamente separado.Há algum tempo, enfrentei uma situação semelhante em que precisava usar o coprocesso ksh para sqlplus e só tinha um ssh através do qual leituras e gravações deveriam ocorrer.
Uma maneira de fazer isso é canalizar todo o comando dependente em uma linha (use;) para / usr / bin / ksh na máquina remota. por exemplo:
fonte