Linux에서 종료 될 때까지 기다리는 명령이 있습니까?


11

포트 배치와 함께 putty / plink를 시작하는 Windows 배치 파일을 만들려고하는데 아무것도 없습니다. Windows 부분은 지금까지 준비되었습니다.

start plink.exe -ssh -i key.ppk -L 1234:localhost:80 sampleUser@192.168.0.1

인증 후 다른 명령을 실행하고 싶지 않기 ForceCommand때문에 Match User선언 과 함께 사용 하고 있습니다 .

Match User sampleUser
    ForceCommand echo 'Success! Close this window to log out.'

문제는 배치 파일을 실행하면 퍼티가 올바르게 시작되지만 지정된 텍스트 에코를 실행 한 직후 닫힙니다.

내 생각은 다음과 같은 것을 사용하는 것입니다.

ForceCommand echo 'Success! Close this window to log out.' && waitTillControlC

이렇게하면 퍼티 / SSH가 연결을 유지하고 포트 전달을 종료하지 않아야합니다.

나는 yes, ping또는 같은 명령을 생각 read했지만

  • 터미널 창 스팸
  • 실제로 일을하고 / 불필요한 CPU 부하를 생성
  • 누군가가 enter를 누르면 예기치 않게 닫힐 수 있습니다.

누군가가 Ctrl + C로 명령을 종료하거나 퍼티 창을 닫아 SSH 연결을 닫을 때까지 영원히 아무것도하지 않는 명령이 있습니까?

무엇을 사용해야 waitTillControlC합니까?


superuser.com/questions/587629/… 와 같은 질문을 찾았 지만 사용자에게 준비된 쉘을 남겨 두었습니다.
— stuXnet

답변:


13

다른 모든 응답이 여기에서 루프를 사용하려는 이유를 얻지 못합니다. 수면은 실제적인 목적을 위해 충분히 오래 기다릴 수 있으며 클럭 사이클을 사용하지 않습니다.

예를 들어, 100 년 동안 모호한 잠을 자려고 노력할 것이며, 어쨌든 그 요청을 준수하기에 충분할 것입니다.

echo "Something"; sleep 36500d

또는 Enter키 를 입력 할 때까지 차단해야 합니다.

echo "Something"; read foo

9

-N대신 옵션을 사용해보십시오 . 로부터 plink문서 :

-N        don't start a shell/command (SSH-2 only)

매뉴얼 페이지에 설명 된 ssh옵션 과 동일한 동작입니다 .-N

-N      Do not execute a remote command.  This is useful for just for-
         warding ports (protocol version 2 only).

2
이것이 정답입니다. 다른 사람이 해결 방법을 만드는 방법을 말하지만,이 사람은 그것을 수행하는 방법을 말한다 권리 .
— Moshe Katz

편집 해 주셔서 감사합니다. Windows 상자를 확인하지 않아도 온라인으로 plink 문서를 찾지 못했습니다.
— chepner

이 답변은 내 요구에 맞지 않습니다 I don't want to allow to execute other commands after authentication. -N클라이언트 측 에서이 작업을 수행하므로 인증 후 다른 명령을 실행하기 위해 -N을 제거하면됩니다.
— stuXnet

8

이것은 주목할만한 양의 CPU 전력을 소비하지 않고 영원히 잠 들어야합니다.

echo "Something" && while true; do sleep 9999; done

ForceCommand절 에서와 같이 명령을 내릴 수 있는지 확실하지 않습니다 . 명령을 쉘 스크립트에 넣어야 할 수도 있습니다.

#!/usr/bin/env bash
echo "Success! Close this window to log out." && while true; do sleep 9999; done

이 스크립트는 물론 서버에 일반 사용자가 쓸 수 없도록 권한이 있어야합니다.

Match User sampleUser
    ForceCommand /usr/bin/waitforever

편집하다

더 우아해 보이는 명령을 찾았습니다.

echo "Something" && tail -f /dev/null

tail -f파일 또는 스트림이 바이트를 리턴 할 때까지 기다립니다. (실시간으로 로그를 보는 데 유용합니다.) /dev/null바이트를 반환하지 않습니다. 그래서 명령은 영원히 잠들 것입니다.


이 순간, 나는 나 자신을 위해 수면 루프를 시도하고 있었다-그래, 이것은 확실히 작동한다! 심지어 직접 ForceCommand과 :ForceCommand echo 'congrats' && while true; do sleep 9999; done
— 스턱 스넷

tail -f /dev/null기술적으로 9999 루프보다 나쁩니다. 프로세스는 2 시간 56 분이 아닌 1 초마다 깨어납니다.
— jlliagre

여기에서 찾았습니다 : unix.stackexchange.com/questions/42901/… 그 질문에 대답하는 사람은 "(이것이 내부적으로 inotify를 사용한다고 가정하면, 폴링이나 웨이크 업 이 없어야하므로 이상하게 보이면 충분합니다.) "이 말이나 꼬리가 inotify잘못 사용한다는 가정이 있습니까?
— nitro2k01

가정은 정확하며 가능한 경우 tail활용하도록 최적화되어 inotify있습니다. 이것은 최근의 모든 충분한 배포가 아닌 대부분의 경우의 기본 사례입니다. 그러나 방금 Linux 랩톱에서 테스트하고 tail모니터링을 통해 가짜 활동을 관찰 /dev/null했으므로 클럭 사이클 측면에서 수면을 취하는 것이 확실히 나쁩니다.
— jlliagre

나는 그것이 tail항상 매 초마다 일어날 것이라고 믿지 않는다 . 결과에 대한 가능한 이유는 tail어떤 이유로 든 통신 할 수있는 터미널에서 터미널을 실행하고 sleep있지 않기 때문입니다. 모니터링 tail만하는 것만으로 가짜로 깨어나는 이유는 없습니다 /dev/null.
— nitro2k01

0

간단히 다음을 시도해보십시오.

echo "your commands" && while :; do sleep 1; done

1
향후 방문자의 경우이 작동 방식에 대한 요약을 제공해야합니다. 많은 사람들이 알고 있을지 모르지만 모든 의지를 가정 할 수는 없습니다.
— nerdwaller

지난 20 년 동안 sleepsleep 1
— 쌓아온 어떤 것에서

:의 속기입니다 true. 나는 sleep원칙적 으로 더 긴 기간을 선호합니다 .
— nitro2k01

0

당신은 잘못된 끝에서 이것을 해결하려고합니다. 껍질이 나오지 않게하고 퍼티가 창을 열어두기를 원합니다.

http://the.earth.li/~sgtatham/putty/0.60/htmldoc/Chapter4.html#config-closeonexit- 변경해야 할 내용을 정확하게 설명합니다. "깨끗한 exit 1종료시 에만"옵션 을 사용하려면 ForceCommand 끝에 추가하십시오 .

편집 : 나는 오해했다; 전달 된 포트만 유지하려는 경우 ForceCommand의 출력을 유지하지 않습니다. 이 경우 http://tartarus.org/~simon/putty-snapshots/htmldoc/Chapter4.html#config-ssh-noshell 이 원하는 작업을 수행하지 않습니까?


문제는 창이 닫히지 않고 ssh 터널이 종료된다는 것입니다. PuTTY에 창을 열어 두라고 명령하면 ssh 터널도 유지됩니까?
— Adrian Pronk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.