SSH sai depois de encerrar o caso no script bash

2

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.

    
por ispasov 07.09.2013 / 08:12

4 respostas

0

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.

    
por 09.09.2013 / 17:54
1

Com base no comportamento que você está descrevendo, parece que você está executando seu script assim:

$ ssh remote picker.bash

Exemplo

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$
    
por 07.09.2013 / 10:49
1

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

    
por 07.09.2013 / 17:03
1

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'
    
por 08.09.2013 / 02:48