Expect 및 SSH를 통해 배경 플래그(&) 전달

Expect 및 SSH를 통해 배경 플래그(&) 전달

내 명령줄/bash fu는 꽤 약하지만 내 능력을 연마하기 위해 노력하고 있습니다. 누군가가 도울 수 있기를 바랍니다.

나는 직장에서 사용하는 헤드리스 상자에 SSH를 연결하는 동시에 비밀번호를 보낼 수 있는 아주 간단한 expect스크립트를 작성했습니다(확장할 수 없는 이유로 공개 키를 사용하여 로깅을 자동화할 수 없습니다). 스크립트:

#!/usr/bin/expect -f
set timeout 30
spawn ssh -X ***@10.101.0.133 $argv
match_max 100000
expect "*?assword:*"
send -- "***\r"
interact

상자에는 이미 개발자 환경이 있고 Eclipse가 설치되어 있습니다. 대부분의 경우 상자에 보관된 일부 코드를 작업하기 위해 Eclipse로 직접 터널링하게 되므로 일반적으로 script eclipse.

&생성 중인 SSH 세션에 대한 매개변수로 & 기호를 처리하도록 예상되는 플래그를 어떻게 전달할 수 있습니까 ? 내가 그것을 사용할 때 원격 컴퓨터에서 작업을 수행하는 대신 내 컴퓨터에서 백그라운드 스크립트를 실행하지만 Eclipse가 원격 컴퓨터에서 시작될 때 여전히 컴퓨터의 쉘을 사용할 수 있도록 보낼 script eclipse &수 있기를 원합니다 .&script

이것은 아마도 정말 어리석은 질문일 것입니다. 그러나 어떤 도움이라도 대단히 감사하겠습니다.

고쳐 쓰다:나는 앰퍼샌드를 피하는 방법을 알아냈습니다(분명히 "헛소리 없는" 순간이었습니다...어). 그러나 이는 새로운 문제를 야기합니다. 스크립트에 인수를 전달할 때, 전달된 명령이 실행되면 기대 명령은 상호 작용을 허용하지 않는 것 같습니다. SSH 세션이 종료됩니다. 나는 이것이 기대의 제한이 아니라 SSH 동작의 일부라고 생각합니다. 그래도 답변해 주셔서 감사합니다.

업데이트 2:후손을 위해 스크립트를 다음과 같이 수정하여 원하는 동작을 얻었습니다.

#!/usr/bin/expect -f
set timeout 30
spawn ssh -X ***@10.101.0.133
match_max 100000
expect "*?assword:*"
send -- "***\r"
send $argv
send -- "\r"
interact

답변1

비밀번호를 입력할 필요가 없으면 다음을 수행할 수 있습니다.

ssh -t 'eclipse & exec bash'

-t플래그는 명령 이름을 제공하더라도 ssh에게 터미널을 할당하도록 지시합니다. 원격 셸은 명령을 실행하므로 비대화형이어야 하지만 마지막으로 수행되는 작업은 exec bash대화형인 새 셸 인스턴스로 자신을 바꾸는 것입니다. (당신이 가장 좋아하는 쉘로 교체하십시오 bash. zsh)

비밀번호를 입력해야 하는 경우 일종의 터미널에 비밀번호를 입력해야 합니다( expect이것이 해당 부분을 자동화하는 경우 비밀번호가 필요한 이유입니다). ssh명령줄 인수나 파일에서 비밀번호 읽기를 의도적으로 거부합니다.

유용할 수 있는 한 가지 방법은 기본 SSH 연결을 한 번에 생성하고 이에 피기백하는 것입니다. 마스터 서버가 실행 중인 동안에는 인증이 필요하지 않은 슬레이브 서버 연결을 설정할 수 있습니다. 다음 줄을~/.ssh/config:

Host nickname
HostName 10.101.0.133
ControlPath=~/.ssh-control:%l:%p:%r

기본 연결을 만듭니다 ssh -MX nickname eclipse( expect비밀번호를 자동으로 전달하려는 경우). 그러면 Eclipse가 실행되는 동안에는 ssh nickname재인증할 필요가 없습니다.

답변2

Geekosaur는 당신이 할 수 있다고 정확하게 지적합니다.참조로 앰퍼샌드 전달, (like를 사용하여 이스케이프할 수도 있음 script eclipse \&) 그러나 여기서는 더 나은 접근 방식을 제안할 수 있습니다. 비밀번호를 사용하여 다른 시스템에 SSH로 접속하고 명령을 실행하는 Expect 스크립트를 작성한 것 같습니다.

이는 실용적인 관점과 보안 관점 모두에서 그다지 좋은 솔루션이 아니라는 점을 알아야 합니다. 실제로 전체 상황은 취약하고 여러 가지 잠재적인 상황으로 인해 충돌이 발생할 수 있으며 디버깅 프로세스가 지저분해질 수 있습니다. 보안 관점에서는 그렇습니다.미친다른 컴퓨터의 시스템 비밀번호가 텍스트 파일 어딘가에 저장되어 있기 때문입니다!

더 좋은 방법이 있습니다!이 문제를 해결하기 위해 키 기반 인증이 구축되었습니다. 비밀번호 없이 인증하려면 키 쌍(한 부분은 서버에 있고 다른 부분은 클라이언트에 있음)을 만듭니다. 이를 통해 Expect를 사용하지 않고 비밀번호를 어디에도 저장하지 않고도 스크립트에서 ssh를 실행할 수 있습니다. 추가 단계로, 암호로 로컬 키를 암호화하고 에이전트나 키링 관리자를 사용하여 키를 사용해야 하는 스크립트를 실행하기 전에 셸에 키를 로드할 수도 있습니다.

편집하다:공개키 인증을 사용할 수 없다고 해서 보고 싶었습니다. 이건 미친 얘기야. 요구 사항을 놓치고 스크립트가 해킹이라는 것을 깨닫지 못한 독자의 이익을 위해 답변을 남깁니다. :)

답변3

참조 사용: script 'eclipse &'.아니요$argv스크립트의 참조 expect는 다른 규칙을 따릅니다 sh. )

관련 정보