sudo를 사용하여 원격 서버에서 SSH를 통해 다른 스크립트를 실행하는 스크립트가 있습니다. 그러나 암호를 입력하면 터미널에 표시됩니다. (그렇지 않으면 잘 작동합니다)
ssh user@server "sudo script"
입력하는 동안 비밀번호가 표시되지 않고 SSH를 통해 sudo의 비밀번호를 입력 할 수 있도록이를 수행하는 올바른 방법은 무엇입니까?
답변
다른 방법은 -t
스위치를 사용하여 다음 을 수행하는 것입니다 ssh
.
ssh -t user@server "sudo script"
참조 man ssh
:
-t Force pseudo-tty allocation. This can be used to execute arbi-
trary screen-based programs on a remote machine, which can be
very useful, e.g., when implementing menu services. Multiple -t
options force tty allocation, even if ssh has no local tty.
답변
다음 명령으로 완전히 자동화 할 수있었습니다.
echo pass | ssh -tt user@server "sudo script"
장점 :
- 비밀번호 프롬프트 없음
- 원격 컴퓨터 bash 기록에서 암호를 표시하지 않습니다
에 대해서는 보안 : 로 커트는 말했다,이 명령을 실행하면 해당 지역의 bash는 역사에 대한 암호를 보여주고, 그것의 .sh 파일에있는 모든 명령을 다른 파일이나 저장 암호를 저장하고 실행하는 것이 좋습니다 것입니다. 참고 : 허용 된 사용자 만 액세스 할 수 있도록 파일에 올바른 권한이 있어야합니다.
답변
비밀번호 프롬프트를 원하지 않는다고 가정합니다 .
ssh $HOST 'echo $PASSWORD | sudo -S $COMMMAND'
예
ssh me@localhost 'echo secret | sudo -S echo hi' # outputs 'hi'
답변
비밀번호를 전달하는 SSH를 통한 Sudo는 tty가 필요하지 않습니다.
sudo에게 대화식 암호가 필요하지 않고 stdin에서 암호를 가져 오도록 지시하여 ssh에 의사 tty (ssh “-t”스위치를 사용하지 않고)를 갖지 않고 ssh를 통해 sudo를 사용할 수 있습니다. sudo의 “-S”스위치를 사용하여이 작업을 수행합니다. 이로 인해 sudo는 stdin에서 비밀번호를 청취하고 개행이 표시되면 청취를 중지합니다.
예 1-간단한 원격 명령
이 예에서는 간단한 whoami
명령 을 보냅니다 .
$ ssh user@server cat \| sudo --prompt="" -S -- whoami << EOF
> <remote_sudo_password>
root
우리는 sudo에게 프롬프트를 발행하지 말고 stdin에서 입력을 받도록 지시하고 있습니다. 이렇게하면 sudo 비밀번호가 완전히 자동으로 전달되므로을 반환하는 유일한 응답은의 출력입니다 whoami
.
이 기술은 stdin 입력이 필요한 ssh over sudo를 통해 프로그램을 실행할 수 있다는 이점이 있습니다. sudo가 stdin의 첫 번째 줄에서 암호를 사용하고 있기 때문에 실행중인 프로그램이 stdin을 계속 잡을 수 있기 때문입니다.
예 2-자체 stdin이 필요한 원격 명령
다음 예에서, 원격 명령 “cat”은 sudo를 통해 실행되며 원격 고양이가 표시하기 위해 stdin을 통해 추가 라인을 제공합니다.
$ ssh user@server cat \| sudo --prompt="" -S -- "cat" << EOF
> <remote_sudo_password>
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2
출력은 <remote_sudo_password>
라인이 sudo에 의해 소비되고 있으며 원격으로 실행 된 cat이 여분의 라인을 표시하고 있음을 보여줍니다.
이것이 유리한 곳의 예는 ssh를 사용하여 명령 행을 사용하지 않고 권한있는 명령에 암호를 전달하려는 경우입니다. ssh를 통해 원격 암호화 컨테이너를 마운트하려는 경우를 가정 해보십시오.
예 3-원격 VeraCrypt 컨테이너 마운트
이 예제 스크립트에서는 별도의 프롬프트 메시지없이 sudo를 통해 VeraCrypt 컨테이너를 원격으로 마운트합니다.
#!/bin/sh
ssh user@server cat \| sudo --prompt="" -S -- "veracrypt --non-interactive --stdin --keyfiles=/path/to/test.key /path/to/test.img /mnt/mountpoint" << EOF
SudoPassword
VeraCryptContainerPassword
EOF
위의 모든 명령 행 예제 (스크립트를 제외한 모든 것) << EOF
에서 명령 행 의 구성은 비밀번호를 포함하여 입력 된 모든 것이 로컬 시스템의 .bash_history에 기록되도록합니다 . 따라서 실제 사용을 위해서는 위의 veracrypt 예제와 같은 스크립트를 통해 전적으로 사용하거나 명령 줄에서 암호를 파일에 넣고 ssh를 통해 해당 파일을 리디렉션하는 것이 좋습니다.
예 1a-예 1 로컬 명령 줄 암호가없는 경우
따라서 첫 번째 예는 다음과 같습니다.
$ cat text_file_with_sudo_password | ssh user@server cat \| sudo --prompt="" -S -- whoami
root
예 2a-예 2 로컬 명령 줄 암호가없는 경우
두 번째 예는 다음과 같습니다.
$ cat text_file_with_sudo_password - << EOF | ssh va1der.net cat \| sudo --prompt="" -S -- cat
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2
스크립트의 내용이 기록에 포함되지 않기 때문에 스크립트에 모든 것을 넣을 경우 별도의 파일에 비밀번호를 입력 할 필요가 없습니다. 암호를 볼 수없는 사용자가 스크립트를 실행할 수 있도록하려면 여전히 유용 할 수 있습니다.
답변
가장 좋은 방법은 ssh -t user@server "sudo <scriptname>"
예를 들어 ssh -t user@server "sudo reboot"
입니다. 먼저 사용자의 비밀번호를 묻는 프롬프트를 표시 한 다음 루트 권한을 갖습니다 (루트 권한으로 스크립트 또는 명령을 실행하므로).
나는 그것이 당신의 의심을 돕고 없애기를 바랍니다.
답변
NOPASS
대상 시스템의 구성에 솔루션이 있습니다. http://maestric.com/doc/unix/ubuntu_sudo_without_password 에서 계속 읽으십시오
답변
echo $VAR_REMOTEROOTPASS | ssh -tt -i $PATH_TO_KEY/id_mykey $VAR_REMOTEUSER@$varRemoteHost
echo \"$varCommand\" | sudo bash