O problema estava em bash_aliases. Eu tive que remover exec
antes do script. Então agora o arquivo bash_aliases se parece com:
command="/path/to/script.sh"
O exec
faz com que o SSH saia da sessão.
Portanto, tenho o seguinte script padrão:
#!/bin/bash
PS3='Please enter your choice: '
options=("option 1" "Option 2" "Option 3" "Quit")
select opt in "${options[@]}"
do
case $opt in
"Option 1")
echo "you chose choice 1"
;;
"Option 2")
echo "you chose choice 2"
;;
"Option 3")
echo "you chose choice 3"
;;
"Quit")
break
;;
*) echo invalid option;;
esac
done
Mas quando eu executo o script através do SSH e escolho a opção Sair, o SSH também sai. O que pode causar o problema? Eu só quero sair do script e continuar o trabalho no SSH.
Bem, o problema estava no arquivo .bash_aliases que discuti abaixo. Eu fui colocado exec
antes do script. Quando eu removê-lo e executar o comando, tudo estava OK.
Com base no comportamento que você está descrevendo, parece que você está executando seu script assim:
$ ssh remote picker.bash
Quando eu ssh
em um sistema remoto, ele funciona como esperado, principalmente que eu permaneço no servidor remoto depois que o script é concluído.
Digamos que eu tenha 2 computadores, remoto e lappy. Vamos denunciá-los usando "L" para lappy e "R" para remotey.
L$ ssh remotey
R$ ./picker.bash
1) option 1
2) Option 2
3) Option 3
4) Quit
Please enter your choice: 4
R$
No entanto, se eu executar o script assim, obtenho o comportamento que você está descrevendo onde o terminal ssh
desaparece:
L$ ssh remotey ./picker.bash
1) option 1
2) Option 2
3) Option 3
4) Quit
Please enter your choice: 4
L$
Você pode iniciar uma sub-shell a partir da opção 4, mas quando eu tento com 'exec / bin / bash --login' o prompt da sub-casca é perdido, tornando o shell remoto um pouco difícil de usar.
A página man do ssh parece sugerir que você pode executar um shell Xor um comando, mas não ambos:
SYNOPSIS ssh [many options] [user@]hostname [command] ...
If command is specified, it is executed on the remote host instead of a login shell.
...
When the user's identity has been accepted by the server, the server either executes the given command, or logs into the machine and gives the user a normal shell on the remote machine.
...
The session terminates when the command or shell on the remote machine exits
Se você executar ssh remotehost somescript
, o script será executado e pronto. Você só recebe um shell interativo se não especificar um comando remoto: o shell interativo é o comando remoto padrão. Quando o script sai, a sessão remota é concluída.
Se você deseja executar um shell interativo após o script, diga ao SSH que deseja ambos. Adicione a opção -t
para que você obtenha um terminal no host remoto: por padrão, o SSH só cria um terminal quando você diz para ele executar um shell interativo, não quando você especifica um comando.
ssh -t remotehost '/path/to/script; exec bash'
Observe que qualquer variável de ambiente definida no script não estará disponível. Se você precisar disso, digite o script no shell remoto. Isso também permite fechar a sessão a partir do script: exit
no script não apenas sairá do script, mas de toda a sessão remota, já que tudo está sendo executado dentro de um shell.
ssh -t remotehost '. /path/to/script; exec bash'
Tags ssh bash shell-script bash-script