Ssh, 로그인시 명령을 실행 한 다음 로그인 상태 유지? 끊지 않는 ssh를 통해 스크립트를 실행할

나는 이것을 예상대로 시도했지만 작동하지 않았다 : 그것은 결국 연결을 닫았다.

원격 컴퓨터에 로그인하고 명령을 실행하고 연결을 끊지 않는 ssh를 통해 스크립트를 실행할 수 있습니까?

따라서 컴퓨터에서 ssh를 실행하여 해당 디렉토리로 이동 한 다음 명령을 실행하고 로그인 상태를 유지하십시오.

-홍옥

(내가 사용한 것으로 예상)

#!/usr/bin/expect -f
set password [lrange $argv 0 0]
spawn ssh root@marlboro "cd /tmp; ls -altr | tail"
expect "?assword:*"
send -- "$password\r"
send -- "\r"
interact



답변

; /bin/bash원격에서 명령 행의 끝에 a 를 추가 하시겠습니까? 그건:

spawn ssh -t root@marlboro "cd /tmp; ls -altr | tail; /bin/bash -i"

더 나은 방법으로 루트의 .bashrc를 다음과 같이 변경하십시오.

PROMPT_COMMAND="cd /tmp && ls -altr | tail ; unset PROMPT_COMMAND"

🙂


답변

파이썬 에서이 작업을 수행해도 괜찮다면 pexpect 에는 거의 정확히 원하는 것을 수행하는 예제가 있습니다.

import pexpect
child = pexpect.spawn ('ftp ftp.openbsd.org')
child.expect ('Name .*: ')
child.sendline ('anonymous')
child.expect ('Password:')
child.sendline ('noah@example.com')
child.expect ('ftp> ')
child.sendline ('ls /pub/OpenBSD/')
child.expect ('ftp> ')
print child.before   # Print the result of the ls command.
child.interact()     # Give control of the child to the user.

ftp 대신 ssh로이 작업을 수행하려면 다음과 유사한 코드를 원할 것입니다 (pexpect의 예제 파일에는 훨씬 자세한 내용과 정보가 있지만 기본 사항은 다음과 같습니다).

import pexpect
child = pexpect.spawn ('ssh root@marlboro')
child.expect ('Password:')
child.sendline ('password')
child.expect ('prompt# ')
child.sendline ('cd /tmp')
child.expect ('prompt# ')
child.sendline ('ls -altr | tail')
child.expect ('prompt# ')
print child.before, child.after   # Print the result of the ls command.
child.interact()     # Give control of the child to the user.

나를 잘못 생각하지 마라. 나는 (특히 자동 기대) 기대하지만, 파이썬은 내가 너무 쉽게 이해하기 쉽다.


답변

서버로 ssh하고 대화식 쉘을 생성하고 해당 쉘 내에서 명령을 실행하는 가장 쉽고 깨끗한 방법은 bash에 대한 사용자 정의 rc 파일을 작성하는 것입니다.

서버의 사용자 정의 bashrc 파일에서 먼저 기본 파일을 소싱 한 다음 사용자 정의 명령을 추가하십시오 (예 :

~ / .bashrc_custom :

. ~/.bashrc
cd dir/
workon virtualenvproject

그런 다음 다음과 같이 SSH 세션을 시작할 수 있습니다.

$ ssh -t server "/bin/bash --rcfile ~/.bashrc_custom -i"

-t옵션은 pseudo-tty 할당을 강제 실행하여 탭 완성과 같은 기능이 작동하도록합니다.

--rcfile옵션은 기본 파일 대신로드 할 rcfile을 지정합니다. 중요 사항 : 인식하려면 단일 문자 옵션 앞에 명령 행에 “이중 대시 인수”를 넣어야합니다.

-i대화식 쉘을 호출하기 위해 / bin / bash에 대한 인수가 있습니다.


답변

누군가 백그라운드에서 일어나는 일에 대한 정보를 원한다면 sshd 매뉴얼을 살펴보십시오.

사용자가 성공적으로 로그인하면 sshd는 다음을 수행합니다.

  1. 로그인이 tty에 있고 명령이 지정되지 않은 경우, 마지막 로그인 시간 및 / etc / motd를 인쇄합니다 (구성 파일에서 또는 ~ / .hushlogin에 의해 금지되지 않는 한, 파일 섹션 참조).
  2. 로그인이 tty에있는 경우 로그인 시간을 기록합니다.
  3. / etc / nologin 및 / var / run / nologin을 확인합니다. 존재하는 경우, 내용을 인쇄하고 종료합니다 (루트 제외).
  4. 일반 사용자 권한으로 실행되도록 변경합니다.
  5. 기본 환경을 설정합니다.
  6. ~ / .ssh / environment 파일 (있는 경우)을 읽고 사용자는 환경을 변경할 수 있습니다. sshd_config (5)의 PermitUserEnvironment 옵션을 참조하십시오.
  7. 사용자의 홈 디렉토리로 변경합니다.
  8. ~ / .ssh / rc가 있으면 실행합니다. 그렇지 않으면 / etc / ssh / sshrc가 존재하면 실행합니다. 그렇지 않으면 xauth (1)을 실행합니다. “rc ”파일에는 표준 입력의 X11 인증 프로토콜 및 쿠키가 제공됩니다. 아래 SSHRC를 참조하십시오.
  9. 사용자의 쉘 또는 명령을 실행합니다.

https://www.freebsd.org/cgi/man.cgi?sshd(8)#LOGIN_PROCESS


답변

일반적으로 ssh를 목적에 맞지 않는 이런 방식으로 사용하지 않아야합니다.

ssh-add -l | grep "file_of_your_rsa_priv_key_here"

키가 ssh 활성 세션 풀에 나열되어 있는지 확인하거나 직접 ssh-add로 추가하십시오.


답변