TL; DR : a resposta da int_ua é o caminho a seguir, mais simples e sem esforço.
Por que isso funciona da maneira como funciona
Isso volta ao comportamento básico de qualquer shell. Quando você faz login como ssh [email protected]
, você obtém a versão interativa do shell. Quando você executa ssh [email protected] -t "command1;command2"
, basicamente obtém /bin/sh -c 'command1;command2'
. O primeiro permite executar o que você colocar no stdin
enquanto obtém os arquivos de pontos, enquanto o segundo apenas executa esses comandos e saídas. Essencialmente, não há como executar um comando antes do uso interativo (a menos que esteja em um dos arquivos de ponto) ou obter um shell interativo do comando single-shot sh -c
(ou qualquer shell que seja, não necessariamente sh
).
Idéias com falha ou incompletas
Minha primeira idéia que tive é a seguinte: se o shell usa o local do servidor .bashrc
, alguém poderia usar o arquivo local do cliente no servidor? Bem, não . Não, a menos que você copie o arquivo de pontos para o servidor remoto com scp ou rsync.
A segunda ideia que eu tive é a PROMPT_COMMAND
. Esta% nice bash
variável executa o comando toda vez antes de mostrar seu prompt PS1
, então por que não definir essa variável antes de gerar bash
to PROMPT_COMMAND="who; unset PROMPT_COMMAND"
para que seja executada como single-shot?
O problema é que essa variável precisa ser exportada para o servidor remoto, e resposta do Gilles me ajudou a fazer algo parecido com isso :
ssh -o SendEnv=PS1 ssh localhost -t bash
ou
ssh localhost -t " PROMPT_COMMAND='who; unset PROMPT_COMMAND' bash "
Problema? -o opção SendEnv deve permitir que a variável específica que você está tentando enviar em /etc/ssh/sshd_config
, e, além disso, em qualquer caso, você ainda pode executar todas essas coisas com /bin/sh -c
Melhoria ligeira da resposta da int_ua
Então, agora, podemos ver que o padrão ssh user@server -t 'command1;shell'
funciona melhor. Exceto por haver um pequeno detalhe: /bin/sh -c
process ainda está lá, então por que não executar bash
com exec
para substituir esse processo?
ssh [email protected] -t 'who;exec bash'