ssh와 ssh를 통한 쉘 : 종료하는 방법?


22

다음과 같이 SSH를 통해 먼 스크립트를 시작합니다.

ssh user@ipaddress '~/my_script.sh'

모든 것이 잘 진행되지만 스크립트가 완료되면 연결이 닫히지 않습니다. 현재 연결을 끊으려면 CTRL-C를 눌러야합니다.

'~ / my_script.sh'에서 "exit"명령을 시도했지만 쓸모가 없습니다. '~ / my_script.sh'에서 "logout"명령을 시도했는데 메시지가 나타납니다.

logout: not login shell: use exit

...

스크립트가 완료되면 SSH를 자동으로 올바르게 닫으려면 어떻게해야합니까?

(명확한 수정 :) 내 스크립트 안에 무엇이 있습니다 :

#!/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

SSH를 통해 시작하면 실행되고 마지막에 "All done"을습니다. 따라서 이것은 마지막 두 줄에 도달 한다는 것을 의미 합니다 .

자동으로 닫고 홍보하는 방법에 대한 모든 아이디어


1
스크립트에 무엇입니까?
Ignacio Vazquez-Abrams

@Olivier : 포트 (에이전트 및 X 포함)를 전달합니까? 명령이 종료되고 모든 TCP 연결이 닫히면 ssh 연결이 닫힙니다.
Gilles 'SO- 악마 중지

@Gilles : 아니요 스크립트를 실행하기 위해 쉘 연결을 만들면 아무것도 전달되지 않습니다.
Olivier Pons

1
@Olivier : 당신이 ~/.ssh/config그것을 가지고 있다면 그것을 시도하지 않고 옵션 -a -x(및 아니오 -o)을 ssh전달하여 전달이 진행되지 않도록하십시오. 여전히 작동하지 않으면 스크립트 내용을 표시하십시오.
Gilles 'SO- 악마 중지

@Olivier : 스크립트가 대기중인 백그라운드 작업을 시작합니까? 불행히도 작업은 ssh 스크립트에서 아무 것도 반환하지 않는 것 같습니다. 예 : ssh <yourusername>@localhost '(ls; sleep 10 &); echo Done; jobs'파일을 나열하고 완료 표시하고 10 초 동안 기다렸다가 돌아옵니다.
asoundmove

답변:


19

쉘 스크립트의 종료는 쉘이 아닌 스크립트에서 종료되므로 작동하지 않습니다. 스크립트가 완료된 후 쉘에서 나가려면

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

그러면 스크립트가 실행되고 셸에서 종료됩니다.


3
종료해야합니다. 스크립트 쉘입니다.
추후 공지가있을 때까지 일시 중지되었습니다.

@ 데니스 : 그것은 그를 위해 작동하지 않으므로 대신 작동 할 수 있습니다.
Wuffers

2
@씨. Man : 명령은 쉘 sshd이 쉘과 쉘 사이에 존재한다는 점을 제외하고는 원래 명령과 동일합니다 myscript.sh. exit도움을 스크립트의 종료를하지 않는 경우에 당신이 쓴이 역할을합니다. 솔루션이 작동 할 수있는 유일한 방법 sshd은 부모가 쉘 일 때 스크립트가 기괴한 일을하고 부모가 쉘 일 때 그 기괴한 일을하지 않는 경우입니다.
Gilles 'SO- 악마 중지'11

어떻게 도움이되지 않습니까? 종료하면 쉘이 닫히고 연결이 종료됩니다. 맞습니까? 그리고 이것이 포스터가 원하는 것이 아닌가?
Wuffers

3
@MrMan : ~/my_script.sh && exit종료하자마자 ~/my_script.sh종료됩니다. 쉘 스크립트가 종료되지 않으면 명령은 결코 exit비트에 도달하지 않습니다 . 그래서 그것은 쓸모가 없습니다.
Gilles 'SO- 악마 중지

12

ssh (여기서는 쉘)로 시작한 프로세스가 여전히 사용중인 다른 프로세스가있는 경우 ssh 연결은 열린 상태로 유지됩니다. ssh 데몬이 따르는 정확한 규칙을 모르지만 적어도 하위 프로세스의 표준 출력이 여전히 ssh에서 제공 한 원본 파이프에 연결된 경우 연결이 사용 중입니다. 비교:

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

데몬을 시작할 때, 데몬을 백그라운드로 만들고 파일 디스크립터를 닫아야합니다. 적어도 이것을 사용하십시오 :

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

nohup앞에 추가하고 싶을 수도 있습니다 . 여기서 차이는 없지만 스크립트가 터미널에서 실행 된 경우 유용합니다. 데몬으로 작동하도록 설계된 많은 프로그램에는 명령 줄 옵션이있어 포크, 파일 설명자를 닫고 신호 및 기타 기능을 무시할 수 있습니다. qaswvd문서가 있으면이를 확인하십시오 . "데모 나이저"유틸리티를 조사 할 수도 있습니다.


같은 문제가 있었고 작동합니다. 허용 된 답변이 작동하지 않습니다.
Andy

5

나는 같은 상황의 해결책을 구글 검색했을 때이 게시물을 보았습니다. @Oliver의 문제를 해결하는 것이 다소 늦었지만 수용 된 답변이 OP 또는 나에게 분명히 작동하지 않기 때문에 (왜 받아 들여 지는지 모름) 향후 Google 직원을 위해 자체 솔루션을 게시하고 싶습니다. 간단합니다 : 명령에 -f옵션을 추가하십시오 ssh:

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

편집하다

-f옵션 의 효과는 ssh백그라운드 에 두는 것이므로 추가 옵션을 추가하지 않으면 연결이 끊어진 것처럼 보이더라도 연결이 여전히 활성 상태 일 수 있습니다. 관심이 있다면이 사이트의 다른 게시물 에 제공된 답변을 참조 할 수 있습니다 .


주의 : 원본 스크립트에 사용자 입력 프롬프트가있는 경우이 (-f)가 작동하지 않습니다.
madD7

3

이그나시오처럼, 나는 당신의 대본에 무엇이 있는지 궁금합니다.

아마도 오류 조건을 생성하는 가장 작은 예제로 스크립트를 시도하고 줄일 수 있습니다.

또는 빈 스크립트에서 시작하여 문제가 나타날 때까지 한 번에 명령을 추가하면 스크립트가 어떤 명령으로 인해 잠기는 지 알 수 있습니다.

빈 스크립트로 인해 문제가 발생하면 .sh_logout 또는 종료시 호출되는 ssh 구성과 같은 ssh 구성을 조사 할 수 있습니다.


제안 해 주셔서 감사합니다. 이제 질문에 스크립트 샘플을 추가했습니다.
Olivier Pons

@Olivier : 스크립트의 관련없는 부분 만 추가했습니다. 독자가 문제재현 할 수 있도록 스크립트 (필요한 경우 사용 지침)를 게시 하십시오 . 스크립트를 최대한 단순화하지만 더 이상은 없습니다.
Gilles 'SO- 악마 중지'12

@Gilles 감사합니다. 내 질문을 수정하고 전체 스크립트를 추가했습니다. 도움이 되었기를 바랍니다. 문제는 배경 프로세스 ( "./qaswvd &"줄)를 시작한다는 사실 일 수 있습니다 . 이것이 문제의 근원 일 수 있습니까?
Olivier Pons

1
@Olivier : 그렇습니다. 메인 프로세스는 백그라운드 프로세스가 종료되기 전에 대기합니다. 종료 한 후에도 계속 실행하려면 nohup을 시도 할 수 있습니다. 그것이 ssh와 함께 작동하는지 확실하지는 않지만 상처를 입지 않도록 시도하십시오.
asoundmove

2

스크립트에서 작업을 사용할 수 있습니다. 이 경우 쉘은 작업이 완료되기를 기다렸다가 분리하지 않으려 고합니다.

다시 게시하지는 않겠습니다. http://en.wikipedia.org/wiki/Nohup#Existing_jobs


내 질문을 수정하고 전체 스크립트를 추가했습니다. 도움이 되었기를 바랍니다. 문제가 백그라운드 프로세스 ( "./qaswvd &"줄)를 시작한다는 사실 일 수 있습니다. 당신이 옳다면, 이것이 문제의 근원 일 수 있습니까?
Olivier Pons

백그라운드 프로세스는 문제이지만 nohup서버 측에 터미널이 없으므로 여기에서 직접 문제는 아닙니다. 범죄자는 특히 열린 파일 설명자입니다.
Gilles 'SO- 악마 그만해'

네, 그것이 문제라고 생각합니다. 위의 링크에서 해킹을 적용하거나 해킹을 시도 할 수 있습니다.
Oleksiy Khilkevich


0

문제는 다음과 같습니다.

./qaswvd &

이 명령은 여전히 ​​실행 중이며 stdin 및 stdout & stderr가 닫힐 때까지 ssh 파이프를 열린 상태로 유지합니다.

대신 이것을 사용하십시오 :

./qaswvd </dev/null >/dev/null 2>&1 &
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.