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.