Atualmente eu uso Fish como meu shell principal em hosts locais e remotos.
Eu me conecto a hosts remotos via ssh e sftp. Eu queria abrir ou reutilizar um tmux remoto sempre que eu conectar, automaticamente, por padrão; então eu adicionei isso ao meu ~/.ssh/config
:
Host example.com
RemoteCommand tmux a; or tmux
RequestTTY yes
O problema é que agora não consigo me conectar pelo sftp
, nem posso executar um comando direto da minha CLI local:
➤ ssh example.com ping localhost
Cannot execute command-line and remote command.
➤ sftp example.com
Cannot execute command-line and remote command.
Connection closed
Então, minha pergunta é: Como posso definir um comando padrão a ser executado ao abrir uma nova sessão SSH interativa, mas torná-lo substituível?
Opção 1 )
Você pode usar a opção Match ( veja man ssh_config )
Isso apenas diferenciará a diferença entre ssh e sftp
opção 2
Você cria alguma configuração de espaço reservado para seu comando diffe, exemplo:
E depois você ainda pode usar example.com para seu uso de sftp/ping.
Estou usando algo mais complexo que lida com opções ssh e espaço em argumentos:
Além disso, se alguém quiser usar RemoteCommand para algumas máquinas (como dentro de "host xxxx"), o mesmo truque pode ser usado na lógica reversa (as correspondências são avaliadas após o host):
Se alguém estiver curioso, estou usando o RemoteCommand para chamar a tela:
Uma opção seria criar um alias de link simbólico para o
ssh
comando:Para facilitar a vida, certifique-se que
$HOME/bin
está no seu$PATH
.Na sua configuração ssh:
Agora, você pode optar por usar
ssht example.com
oussh example.com
para sessões tmux e não tmux, respectivamente.aqui está uma solução que funcionou para mim.
Funciona para bash e fish
fish não suporta $_ como @Yajo disse
Eu usei
tmux new -A
porque meu servidor distante suporta o tmux 3.1 e o anexo automático se a sessão existir.Eu tive que usar
%%self
para escapar do % e poder usar %self.Aqui está como funciona
Você pede para selecionar o processo atual com
--pid %self
, mas pede para exibir seu pid pai com-o ppid
, então pede para obter apenas o valor e descarta o cabeçalho com--no-headers
então agora você tem o pid do que deveria ser o comando ssh/scp/sftp.
agora você precisa saber, qual comando o executou.
| xargs -r ps ww --pid
lançaráps ww --pid YOUR_PARENT_PID
O
-r
estado para evitarxargs
a inicializaçãops
se o comando anterior não corresponder a nada.Estou usando
xargs
e não$()
, porque o fish não suporta,$()
mas()
essa diferença faria com que meu código funcionasse embash
oufish
, mas não em ambos, então estou usandoxargs
então temos o
ps ww --pid YOUR_PARENT_PID
:ww
irá despejar a linha de comando completa, então aqui você pode jogar com fgrep como eu fiz ou wc como @cryptarch fez.Isso não responde diretamente à pergunta. No entanto, tornou-se para mim a solução para o problema da raiz, então acho que merece um post.
O que eu realmente queria é entrar automaticamente no tmux. Em vez disso, comecei a usar o byobu, que se baseia no tmux, mas é muito mais confortável. Por exemplo, ele suporta esse caso de uso pronto para uso.
Após instalar o byobu, basta executar:
E você está feito. A próxima sessão interativa entrará no byobu automaticamente, não importa o shell. As conexões não interativas funcionarão normalmente.