Ssh, 로그인시 명령을 실행 한 다음 로그인 상태 유지?


29

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

원격 컴퓨터에 로그인하고 명령을 실행하고 연결을 끊지 않는 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

9
pubkeys 또는 다른 제정신 방법을 사용하는 대신 나 또는이 방법으로 비밀번호 인증을 "자동화"합니까?
grawity

답변:


25

; /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"

:)


2
-i그 배쉬 에 추가하고 싶을 수도 있습니다 .
Teddy

Yeh, 나는 생각한다 :)
Bill Weiss 09.

이렇게하면 새 셸에서 탭 완성이 중단됩니다 ( "-i"로도). 왜 / 어떻게 수정해야하는지 알 수 있습니까?
코더

1
나는 여기에 새로운 대답을 테스트했는데 훌륭하게 작동합니다. 조금 거칠지 만 작동합니다.
Bill Weiss


4

파이썬 에서이 작업을 수행해도 괜찮다면 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.

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


나도 기대에서 pexpect로 전환하고 있습니다. 파이썬은 이제 훨씬 더 보편적입니다.
JM Becker

4

서버로 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에 대한 인수가 있습니다.


실제로는 아닙니다. 각 연결마다 다른 명령을 실행하려면 어떻게해야합니까?
Eugen Konkov

1

누군가 백그라운드에서 일어나는 일에 대한 정보를 원한다면 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


0

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

ssh-add -l | grep "file_of_your_rsa_priv_key_here"

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

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