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 권한을 갖도록 허용할 수 있습니다.