답변:
다른 방법은 -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.
ssh -t localhost <<< "sudo touch file;"
편집 분명히 표준을 통하지 않고 매개 변수로 명령을 제공하는 것이 중요합니다 (이후에는 의미가 있음).
-t
방법은 또한 일반적으로 그렇게하는 명령의 컬러 출력을 보여줍니다.
다음 명령으로 완전히 자동화 할 수있었습니다.
echo pass | ssh -tt user@server "sudo script"
장점 :
에 대해서는 보안 : 로 커트는 말했다,이 명령을 실행하면 해당 지역의 bash는 역사에 대한 암호를 보여주고, 그것의 .sh 파일에있는 모든 명령을 다른 파일이나 저장 암호를 저장하고 실행하는 것이 좋습니다 것입니다. 참고 : 허용 된 사용자 만 액세스 할 수 있도록 파일에 올바른 권한이 있어야합니다.
-t
, 두 번 전달할 수있을 정도로 매뉴얼을주의 깊게 읽지 못했습니다! 이것은 내가 몇 달 동안 찾고 있었던 것입니다 ! 보안 추가로으로 실행하기 전에 비밀번호 변수를 설정 한 read -s -p "Password: " pw
다음을 수행했습니다 echo "$pw" | ....
. 나는 이것을 이것을 편리한 스크립트로 만들었습니다 :).
비밀번호 프롬프트를 원하지 않는다고 가정합니다 .
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
스크립트의 내용이 기록에 포함되지 않기 때문에 스크립트에 모든 것을 넣을 경우 별도의 파일에 비밀번호를 입력 할 필요가 없습니다. 암호를 볼 수없는 사용자가 스크립트를 실행할 수 있도록하려면 여전히 유용 할 수 있습니다.
cat
에서 결과 를 실행 하여 sudo로 파이프 해야하는 이유는 무엇입니까? sudo
기본 ssh 원격 명령으로 사용할 수 있습니까 ?
cat
은 사용자의 비밀번호를 다른 쪽의 sudo로 파이프하는 데 사용됩니다. 사용자가 비밀번호없이 sudo를 실행할 수 있으면 필요하지 않지만이 구성을 권장하지는 않습니다. 파이프 된 이유는 원격 sysrtem의 명령 행에 비밀번호가 표시되지 않도록하기위한 것입니다. 명령 줄은 안전하지 않으므로 모든 사용자는로 모든 명령 줄을 볼 수 있습니다 ps auxwww
.
cat
ssh 명령을 요구하고 cat \| sudo --prompt="" -S...
있습니다. 는 IF -S
힘이 sudo
표준 입력에서 암호를 읽어, 고양이와 파이프는 전혀 필요합니까? ssh 명령은 간단 할 수 sudo --prompt="" -S...
있습니까?
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
나는 문제에 직면했다
user1@server1$ ssh -q user1@server2 sudo -u user2 rm -f /some/file/location.txt
Output:
sudo: no tty present and no askpass program specified
그런 다음 시도했다
#1
vim /etc/sudoers
Defaults:user1 !requiretty
작동하지 않았다
#2
user1 ALL=(user2) NOPASSWD: ALL
제대로 작동했습니다!
사용법에 따라 다음과 같이 성공했습니다.
ssh root@server "script"
루트 암호를 묻는 메시지가 표시되고 명령이 올바르게 실행됩니다.
ssh <user@server> sudo <script>
는 내가 오류를sudo: no tty present and no askpass program specified