내 명령줄/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
. )