ssh
다른 프로세스를 통해 프로세스를 조작 하려고 합니다 . 내가 실행 중인 이미지 ssh root@XXXX
와 pid는 12345입니다. SSH 세션에 명령을 실행하도록 지시하는 프로그램을 실행하고 싶습니다 ls
. 이것을 시도했습니다 echo ls > /proc/12345/fd/0
. SSH 터미널은 에코를 올바르게 표시하지만 를 누른 후에 enter
원격 시스템이 명령을 수신하지 못하는 것 같습니다 ls
.
내가 원하는 것을 할 수 있는 것이 있나요?
좀 더 구체적으로 말하면, 제가 로그인하려는 서버는 공개 비밀번호도 아니고 표준 SSH 인증 방식의 비밀번호도 아닌 동적 비밀번호를 사용하고 있습니다. 서버는 otp를 요청하고 인증합니다.
답변1
저는 네 가지 방법을 생각해 봤습니다.
- 멀티플렉서
- SSH
- 예상되는
- 다른 방법
멀티플렉서
다음을 사용하여 실행 중이거나 실행되도록 설정할 수 있는 창 tmux
에 문자열이나 키 입력을 보낼 수 있습니다 .ssh
tmux new -d -s mySession
tmux send-keys -t mySession.0 "ssh root@XXXX" ENTER
tmux send-keys -t mySession.0 "ls" ENTER
연결에 걸리는 횟수나 비밀번호/키가 필요한지에 따라 마일리지가 달라질 수 있지만 여기서는 당연한 일입니다.
SSH
이는 명확하지 않을 수 있지만 SSH를 통해 직접 명령을 실행하는 대략 두 가지 방법이 있습니다.
- 쉘 명령을 직접 사용
ssh remote "command here"
또는
ssh -t remote "command here"
- SSH와 함께 Heredoc 사용하기
ssh remote << 'EOF' # can use any other marker pair/string as explained below
command
list
here
EOF
이를 통해 실행할 작업에 대해 더 많은 자유를 얻을 수 있으며 여기에서 견적을 처리하는 것이 번거롭지 않습니다.
한 가지 문제는 [여기 텍스트 편집기]에서 구분 기호를 만들 때 태그가 올바르게 닫혔는지 확인할 수 있도록 구문 강조를 사용해야 한다는 것입니다. heredoc
특히 해당 태그가 구분 기호에 나타나는 경우 임의의 문자열을 사용하거나... (또는 그냥 사용) 더 긴 구분 기호 태그도 작동합니다)
필요에 따라 두 가지 방법을 모두 사용할 수 있지만 다음 사항을 기억하세요.
원격 시스템의 각 SSH 프로세스에 대한 PID를 생성하므로 여러 명령을 연속적으로 실행하고 다른 줄이나 heredoc에서 분리하기로 결정한 경우 어느 시점에서 PID가 부족해집니다. 제한된 VM/머신 또는 원격 리소스가 부족한 경우).
필요한 경우 SSH 연결을 계속 유지할 수 있도록 해당 항목을 닫거나 하나만 남겨 두십시오.
두 솔루션 중 하나에서
TERM
변수가 설정되지 않았다고 불평할 수 있습니다. 다음과 같이 설정하세요.
export TERM=xterm
예상되는
언급된 다른 답변과 같이 예상을 사용할 수 있습니다.
#!/usr/bin/expect -f
spawn ssh remote.server.com
expect "password: "
send "passwordhere?\r"
expect "$ "
...... ##Various automated commands##
expect "$ "
send "exit\r"
귀하의 마일리지는 다양합니다훨씬 더여기서 주어진 expect
것은이기다 또는 놓치다, 특히 비밀번호 프롬프트와 상호작용할 때...
다른 방법
다음과 같은 다른 방법을 사용할 수 있습니다.
sendkeys
~에서이것저장소 또는/그리고xdotool
로컬 저장소에서 키/문자열을 특정 창으로 보낼 수 있으며, 이 창은 실행 중인 터미널ssh
이나 선택한 항목으로 설정할 수 있습니다. 다음은 두 가지 모두에 대한 (예제) 구문입니다.
sendkey.sh "Yourwindowname" "yourstringorkey"
또는/그리고
xdotool type --window "window ID here" "your string here"
노트:
때로는 xdotool
및/또는 sendkey
다른 창/프로그램에서 작동할 수도 있고 작동하지 않을 수도 있지만 둘 다 대부분의 터미널에서 작동해야 합니다.
하나가 작동하지 않으면 다른 것을 시도하십시오. 또한 해당 목적 wmctrl
으로 선호하지 않는 한 대상 창의 id/pid/정보를 얻으려면 설치해야 합니다 xprop
... (이미 대부분의 배포판에 설치되어 있습니다).
마지막으로 다음 중 하나를 선택할 수 있습니다.
evdev
(이를 언급해 주신 @Forest에게 감사드립니다)pyinput
pyautogui
이 세 가지는 주로 파이썬 라이브러리로 사용되지만 다른 언어로도 포팅되었습니다... 여기서 이 질문을 다루면 답변이 너무 길어질 것이므로 다른 사람들이 각자의 답변으로 그렇게 하도록 하겠습니다.
답변2
아니요. 설계상 Unix/Linux에서는 프로세스가 이런 방식으로 작동하지 않습니다.
당신이 원하는 것이 무엇인지 이해한다면 이 expect
앱이 도움이 될 것입니다. 읽다 man expect
.