sudo 권한으로 원격 서버에서 로컬 스크립트 실행

sudo 권한으로 원격 서버에서 로컬 스크립트 실행

Ubuntu 16.04에서 VS Code를 사용하여 권한이 있는 원격 서버에서 로컬 스크립트를 실행하고 싶습니다 sudo.

여기 있습니다 local.sh:

#!/usr/bin/env bash
echo $(ifconfig | grep -Eo "inet addr:([0-9]\.?)*")
echo $(whoami)
echo "$1"

test.sh다음은 원격으로 실행하는 데 사용하는 스크립트 버전 중 하나입니다 local.sh.

#!/usr/bin/env bash
remote="example.com"
user="username"
password="remote_password"
ssh "$user@$remote" "bash -s" < ./local.sh "'argument 1'"

이것은 잘 작동합니다. 예상대로 출력은 다음과 같습니다.

$ ./test.sh 
inet addr:123.45.67.89 inet addr:127.0.0.1
username
argument 1

첫 번째 IP 주소는 실제로 서버의 IP 주소입니다.

그러나 원격 서버에서 local.sh실행 하고 싶습니다 . sudo마지막 줄을 다음 줄로 바꾸면 액세스가 차단됩니다.

ssh -tt "$user@$remote" "echo $password | sudo bash -s" < ./local.sh "'argument 1'"

산출:

$ ./test.sh 
[sudo] password for username: 
Sorry, try again.
[sudo] password for username: 

두 번째 프롬프트 이후에 비밀번호를 입력하면 터미널에 해당 문자가 나타나고 Enter를 눌러도 아무 일도 일어나지 않으므로 취소하려면 ^C를 사용합니다.

-t에 대한 플래그로만 사용하면 ssh다음과 같은 출력을 얻습니다.

Pseudo-terminal will not be allocated because stdin is not a terminal.
sudo: no tty present and no askpass program specified

플래그를 전혀 사용하지 않으면 다음과 같은 결과를 얻습니다.

sudo: no tty present and no askpass program specified

내가 제안한 다른 솔루션은 그다지 성공적이지 않았습니다. 내가 무엇을 해야 하는지에 대한 어떤 통찰력이라도 환영받을 것입니다.

답변1

원하는 것을 달성하려면 시도해 보세요. expect
그리고 안전하게 유지하려면 파일을 암호화해 보세요.

http://manpages.ubuntu.com/manpages/bionic/man1/expect.1.html

답변2

expect다음 스크립트를 설치 하고 사용하십시오(테스트되지 않았으므로 버그가 있을 수 있음).

#!/usr/bin/expect
set remote "example.com"
set user "username"
set password "remote_password"
spawn ssh -l $user $remote
expect "$ "
send "sudo bash -s < ./local.sh 'argument 1'\r"
expect "password for $user:"
send "$password\r"
expect "$ "
send "exit\r"

expect대화형 세션을 시뮬레이션합니다. 명령 spawn이 실행 ssh -l $user $remote되고 다음 명령이 상호 작용합니다. 명령 은 expect지정된 텍스트가 출력에 나타날 때까지 기다린 다음 send해당 텍스트를 원격 호스트로 보냅니다. 다른 답변에 지정된 링크에서 자세한 내용을 찾을 수 있습니다.

관련 정보