ssh e shell através do ssh: como sair?

19

Estou lançando um script distante por SSH assim:

ssh user@ipaddress '~/my_script.sh'

Tudo está indo bem, mas quando o script terminar, a conexão não será fechada. Eu Tem que pressionar CTRL-C para quebrar a conexão atual.

Eu tentei o comando "exit" em '~ / my_script.sh' e é inútil. Eu tentei o comando "logout" em '~ / my_script.sh' e recebo uma mensagem:

logout: not login shell: use exit

...

Alguma idéia de como eu poderia fazer para fechar automaticamente e corretamente o SSH depois que o script estiver pronto?

(modificação para esclarecimento :) Aqui está o que está dentro do meu script:

#!/bin/sh
path_sources_qas=/sources/QuickAddress/
path_qas_bin=/usr/bin/qas

umount_disque_qas()
{
  # Umount du disque 'qas' s'il n'avait pas été 'umount' :
  nom_disque_monte='cat /etc/mtab | grep qas | awk '{ print $2}''
  if [ "$nom_disque_monte" != "" ]
  then
    echo "For safety, umount : $nom_disque_monte"
    umount $nom_disque_monte
  fi

}

# Umount twice (we never know if a st***d guy mounted it twice) :
umount_disque_qas
umount_disque_qas

echo "--------------------------------"
echo "Install ISO quick address..."
nom_fichier_iso='ls -t $path_sources_qas | awk '{if (NR==1) {print $1}}''
echo "Mount disk $nom_fichier_iso..."
mount -o loop -t iso9660 $path_sources_qas/$nom_fichier_iso /mnt/qas
echo "Done."

# All the folders are like this :
# /usr/bin/qas/Data.old.10
# /usr/bin/qas/Data.old.11
# /usr/bin/qas/Data.old.12
# ...

echo "--------------------------------"
echo "Stopping QuickAdress server..."
cd $path_qas_bin/apps/
./wvmgmtd shutdown qaserver:2021
sleep 3
echo "Done."

# Get last number of the folder:
num_dernier_dossier_backup='ls -Atd $path_qas_bin/Data.old* | awk '{if (NR==1) {print $1}}' | awk -F . '{print $NF}''
# Add 1 :
let "num_dernier_dossier_backup += 1"
# Full name :
nom_dossier_backup=Data.old.$num_dernier_dossier_backup
echo "--------------------------------"
echo "Saving Data to $nom_dossier_backup..."
cd $path_qas_bin
mv Data $nom_dossier_backup
echo "Done."


echo "--------------------------------"
echo "Copying new folder Data..."
cd $path_qas_bin
cp -r /mnt/qas/Data .
echo "Done."

echo "--------------------------------"
echo "Deleting unused datas..."
cd $path_qas_bin/apps/
rm -f $path_qas_bin/Data/frxmos.dap
echo "Done."

echo "--------------------------------"
echo "Restart server..."
cd $path_qas_bin/apps/
./qaswvd &
sleep 3
echo "Done."
sleep 3

echo "--------------------------------"
echo "Check: server state: you should read 'OK':"
./wvmgmtd srvlist
echo "Done."

echo "--------------------------------"
echo "Check: active licences (only one here):"
./wvmgmtd licencelistread qaserver:2021
echo "Done."

echo "--------------------------------"
echo "Check: counters: number of addresses left:"
./wvmgmtd counterinforead qaserver:2021
echo "Done."

echo "--------------------------------"
echo "Check: Datasets avalaibles:"
./wvmgmtd datalistread current qaserver:2021
echo "Done."

echo "--------------------------------"
echo "Check: "meters" for "licence by click":"
./wvmgmtd meterslistread current qaserver:2021
echo "Done."

echo "--------------------------------"
echo "Removing virtual disk..."
umount_disque_qas
echo "Done."

echo "All done"
echo "Click 'Ctrl-C' to quit."

exit

Quando eu o inicio através do SSH, ele é executado e, no final, eu leio "Tudo pronto." então isso significa que ele alcança as últimas 2 linhas .

Alguma idéia de como eu poderia fazer para fechar automaticamente e pr

    
por Olivier Pons 05.11.2010 / 14:26

7 respostas

17

A saída no script de shell não funciona porque está saindo do script, não do shell. Para sair do shell após o script ser concluído

ssh user@ipaddress '~/my_script.sh && exit'

Isso executará o script e sairá do shell.

    
por 05.11.2010 / 14:30
12

A conexão ssh permanece aberta quando o processo iniciado por ssh (aqui, um shell) é encerrado, se houver outros processos que ainda estejam sendo usados. Eu não sei as regras exatas que o daemon ssh segue, mas uma conexão está em uso, pelo menos, se a saída padrão de qualquer processo filho ainda estiver conectada ao pipe original fornecido pelo ssh. Comparar:

ssh somehost 'sleep 5 &'  # exits after 5 seconds
ssh somehost 'sleep 5 >/dev/null &'  # exits immediately seconds

Quando você inicia um daemon, você deve contextualizá-lo e fechar seus descritores de arquivo. Pelo menos, use isso:

./qaswvd </dev/null >/dev/null 2>/dev/null &

Você pode querer adicionar nohup na frente; não fará diferença aqui, mas seria útil se o script fosse executado a partir de um terminal. Muitos programas projetados para atuar como daemon possuem opções de linha de comando para obtê-los, separar descritores de arquivos, ignorar sinais e outras sutilezas. Verifique na documentação qaswvd se ela tiver um. Você também pode investigar os utilitários "daemonizer".

    
por 22.01.2011 / 19:17
4

Eu vi este post quando pesquisei pela solução da mesma situação. Embora seja meio tarde para resolver o problema do @ Oliver, já que a resposta aceita claramente não estava funcionando nem para o OP nem para mim (não sei por que ele é aceito), eu ainda gostaria de postar minha própria solução para o futuro googler. É simples: adicione uma opção -f no comando ssh :

ssh -f user@ipaddress '~/my_script.sh'

EDITAR

O efeito da opção -f é colocar ssh em segundo plano, portanto, sem nenhuma outra opção adicional, é possível que a conexão ainda esteja ativa, mesmo que pareça estar quebrada. Pode-se referir a resposta dada em outro post neste site se estiver interessado.

    
por 14.06.2013 / 06:01
3

Como Ignacio, estou curioso para saber o que está no seu roteiro.

Talvez você possa tentar reduzir seu script ao menor exemplo possível que produza a condição de erro.

Ou inicie a partir de um script vazio e adicione um comando por vez até ver o problema, então você saberá qual comando faz com que seu script seja bloqueado.

Se o script vazio causar um problema, talvez você queira investigar a configuração do ssh, por exemplo, .bash_logout ou algo assim chamado na saída que pode causar um problema?

    
por 07.12.2010 / 04:33
2

Você provavelmente pode usar trabalhos no seu script. Se for esse o caso, o shell apenas espera que seus trabalhos sejam concluídos e não deseja se soltar.

Eu não vou repostar, apenas o encaminharei link

    
por 19.01.2011 / 19:02
0

Você precisará matar seu processo pai de dentro do seu script.

kill -SIGHUP $PPID

    
por 21.01.2011 / 19:10
0

O problema é provavelmente a seguinte linha.

./qaswvd &

Este comando provavelmente ainda está em execução e manterá o canal ssh aberto até stdin e stdout & stderr está fechado.

Use isso:

./qaswvd </dev/null >/dev/null 2>&1 &
    
por 03.10.2014 / 23:49