다양한 작업을 수행하는 스크립트가 있는데, 무엇보다도 사용자에게 비밀번호를 묻는 메시지를 표시하고 이를 매개변수에 저장 $password
하고 다음 명령을 실행합니다.
ssh [host] 'cd someDir; echo "$password" | sudo -u nobody -S <command>'
문제는 오류가 발생 Sorry, try again
하고 연결이 종료된다는 것입니다.
SSH를 사용하여 sudo 명령을 실행하는 방법은 무엇입니까? 먼저 원격 호스트에 연결한 다음 실행하면 작동합니다.echo 'password_string' | sudo -u nobody -S <command>
답변1
디버깅/문제 해결을 시도해야 합니다. 현재 ssh 명령을 다음으로 변경하십시오.
SSH주인'CD일부 디렉토리; echo "비밀번호는 $password 입니다."'
당신은 얻을 것이다
비밀번호는지금 시도해 보세요
에코 주인'CD일부 디렉토리; echo "비밀번호는 $password 입니다."'당신은 얻을 것이다
주인CD일부 디렉토리; echo "비밀번호는 $password 입니다."
ssh 명령에서는 $password
큰따옴표로 묶이고 작은따옴표로 묶입니다. 글쎄, 이것은 큰 따옴표를 간단한 일반 문자로 변환합니다. LDQ
입력하는 것에 비해 구문적으로 중요하지 않으며 작은 따옴표로 효과적으로 묶습니다 RDQ
. $password
대신 $password
원격 호스트로 전송됩니다.값( $password
즉, 실제 비밀번호). 그런 다음 원격 호스트의 쉘은 $password
값을 확장하려고 시도하지만 변수가 아직 쉘에 설정되지 않았기 때문에 아무것도 얻지 못합니다.
가능한 유효한 명령은 다음과 같습니다.
SSH주인'CD일부 디렉토리; 에코 "'" $password "'" sudo -u 아무도 -S주문하다'
명확성을 위한 공백을 추가하여 확인해 보겠습니다.
... '...;echo "'"$password"'"|sudo..."
작은따옴표 안에는 여전히 큰따옴표가 있습니다. 그러나 리터럴 큰따옴표(뒤에 echo
)를 지정한 후에는작은따옴표 끊기이므로 로컬 명령에서 변수 확장/교체가 발생할 수 있습니다. 그런 다음 $password
큰따옴표로 묶습니다. 그런 다음 명령에 대한 두 번째 큰따옴표, 파이프( |
) 및 작은따옴표 로 돌아갑니다 .sudo
경고: 현재 SSH를 통해 연결할 수 있는 호스트에 액세스할 수 없으므로 아직 완전히 테스트하지 않았습니다.