서버에 ssh를 연결하고 자동으로 sudo 명령을 실행하고 셸을 열어 둡니다.

서버에 ssh를 연결하고 자동으로 sudo 명령을 실행하고 셸을 열어 둡니다.

alias로컬 컴퓨터에 저장된 비밀번호를 사용하여 로컬 컴퓨터에서 ssh대상 시스템을 실행하고 싶지만 sudo원격 시스템에서는 셸을 열어 두려고 합니다. 그 이유는 제가 게을러서 서버에 로그인할 때마다 긴 비밀번호를 입력하고 싶지 않기 때문입니다. 나는 이것이 가장 안전한 일이 아니라는 것을 알고 있습니다.

이제 다음을 수행하면 작동합니다.

ssh -q -t $1 "echo $mypword|base64 -d|sudo -S ls; bash -l"

$1원격 시스템의 호스트 이름입니다. mypword는 로컬 시스템에 저장된 인코딩된 비밀번호입니다. 이것은 작동하고 내 쉘을 열어 둡니다. 그런 다음 sudo를 사용하여 모든 작업을 수행할 수 있습니다. 이제 해당 셸에 대해 캐시가 저장되기 때문입니다.

내가 가진 문제는 내 계정에 대해 ps 및 grep을 실행하면 프로세스 목록에 비밀번호가 포함된 인코딩된 문자열이 표시된다는 것입니다. 그럴 수 없어요. 프로세스 목록에 비밀번호를 표시하지 않고 이를 수행할 수 있는 방법이 있습니까?

나는 시도했다:

echo $mypword|ssh -q -t $1 "base64 -d|sudo -S ls -l /root;bash -l"

소리는 ls났지만 케이스는 열려 있지 않았습니다.

답변1

일반적으로 이 작업은 으로 수행할 수 있습니다 expect. 환경에서 비밀번호를 검색하여 이를 전달 base64하고 출력을 복원하도록 할 수 있습니다. 그런 다음 ssh를 생성하고 $쉘 프롬프트를 기다린 후 sudo명령을 보냅니다. sudo에 대한 비밀번호 프롬프트가 표시되면 디코딩된 비밀번호를 보내고 예상대로 일반적인 방식으로 계속 진행합니다 interact. 다음을 파일에 넣고 실행 가능하게 만든 다음 호스트 이름을 인수로 사용하여 호출하십시오.

#!/usr/bin/expect -f
# https://unix.stackexchange.com/a/422651/119298
log_user 0
spawn base64 -d
send $env(mypword)\n\x04
expect -nobrace -re "\n(.+)$"
close
set output $expect_out(1,string)

spawn ssh -q -t [lindex $argv 0] 
expect {$ }
send "sudo echo hi\n"
expect -nobrace -re {.sudo. password.*:}
send "$output\n"
expect "\n"
interact

답변2

논평할만한 평판이 충분하지 않기 때문에. 응답:

SSH에는 비밀번호가 없습니다. 내 키가 시스템에 존재합니다. sudo 비밀번호를 캐시하고 싶습니다.

sudoers 파일을 편집하여 이 사용자 계정이 해당 시스템에 대해 비밀번호 없는 sudo 권한을 갖도록 허용할 수 있습니다.

관련 정보