Normalmente, se você passar um comando para o ssh dessa maneira
ssh [email protected] 'some-command.sh'
Você obtém uma sessão não interativa e o ssh sai assim que o comando (ou script, ou o que seja) é executado. Como posso obter uma sessão interativa e, ainda assim, executar um comando que especifiquei na minha máquina local. Por exemplo, eu gostaria de poder abrir a tela e reiniciar uma sessão de tela específica:
ssh [email protected] 'screen -r 12345'
mas isso não é permitido, retornando o erro "Deve estar conectado a um terminal". que eu presumo que significa essencialmente "deve chamar esse comando de um shell interativo".
Como outro exemplo, eu uso uma tonelada de máquinas no trabalho que muitas vezes exigem que eu use uma conta compartilhada para ter direitos de fazer certas coisas (sim, eu sei: má ideia, mas não me culpe, não configurei coisas que caminho), e eles geralmente têm o ksh como shell padrão. Gostaria de fazer login, alternar para o bash (ou zsh) e obter o .bash_profile da minha conta (ou .zshrc). Seria fácil se eu pudesse estabelecer uma sessão ssh interativa e passar um comando para a máquina remota para executar no logon.
Eu tenho uma solução muito inteligente (e não testada) em mente que postarei, mas espero que alguém saiba uma maneira melhor.
ATUALIZAÇÃO: para aqueles que não perceberam isso, não estou planejando fazer tudo isso manualmente, portanto, me dizer para abrir uma sessão interativa e depois fazê-lo manualmente não resolve nada.
2ª ATUALIZAÇÃO: Para tentar novamente esclarecer: Estou tentando executar comandos (arbitrários) no servidor (especificado programaticamente no cliente), mas depois tenho uma sessão interativa aberta que é afetada por qualquer coisa executada por esses comandos programáticos.
echo "command" | ssh user@remote_host
Respostas:
Você pode tentar o seguinte comando para iniciar o bash e criar seu próprio perfil quando você ssh:
fonte
-t
opção também resolve o problema do interlocutorscreen
.ssh -t www.dev "echo 'hi there'"
, a conexão será fechada imediatamente após a execução do comando.Com base na resposta do dogbane, uma solução completa se parece com:
Aqui eu uso
-t
para forçar a alocação de um pseudo-terminal, necessário para um shell interativo. Em seguida, executo dois comandos no servidor: primeiro o que eu queria fazer antes de abrir o shell interativo (no meu caso, alterar o diretório para uma pasta específica) e depois o próprio shell interativo. o bash vê que possui um pseudo-terminal e responde de maneira interativa.As aspas simples garantem que tudo seja passado ao servidor remoto como o comando a ser executado pelo seu shell padrão.
Agradecemos novamente ao dogbane por fornecer a pista necessária
-t
. Eu costumava resolver esse problemaexpect
, o que definitivamente mata um rato com um canhão. (:fonte
Experimente esta solução.
O logon é interativo e seu comando é passado como se você o digitasse na linha de comando interativa. A sessão termina como se você tivesse digitado
fonte
ssh
.-t
ou o seu próprio arquivo de bash. +1Use ssh -X para usar cmd termIO.
Além disso - você pode encadear seus cmds como "ssh 'source ~ / .bashrc && cd && do'"
fonte
por que não instalar desanexar no sistema remoto e usar:
fonte
detach
,ls
não mantém a sessão aberta e será desconectada sem imprimir a saída de,ls
mas ainda será executada.A resposta de laggingreflex está próxima ... Eu mudaria da seguinte forma:
Infelizmente, é provável que você não goste da maneira como isso funciona, porque "cat" armazena em buffer as linhas que ele escreve no stdout ... Se criarmos um script chamado "echo-cat" que se parece com isso:
obteremos o mesmo resultado sem o buffer:
Isso provavelmente o levará muito mais perto do seu objetivo ...
fonte
Isso é kludgey e não testado, mas acho que deve funcionar.
Crie um script chamado (por exemplo) remote-starter que use um argumento entre aspas após um argumento user @ host:
Esse script deve primeiro salvar o comando entre aspas (sem aspas) no arquivo nomeado (por exemplo)
.onetime
na máquina remota e, em seguida, executar um comando ssh regular, desta vez sem passar nenhum comando a ser executado na máquina remota. (Se você estiver executando ssh [email protected] a partir de um script, poderá funcionar para executar exec ssh [email protected].)Para que isso funcione, a máquina remota deve obter
.onetime
seu .bash_profile ou .zshrc ou qualquer outra coisa. Após a execução.onetime
, ele deve ser excluído.onetime
, para que o arquivo não seja executado na próxima vez que você fizer um logon regular.fonte