원격 컴퓨터에서 루트로 수정하지 않고 로컬 컴퓨터에서 스크립트/명령을 실행할 수 있는 방법이 있는지 궁금합니다.
일부 배경
Capistrano를 통해 일부 작업을 설정하려고 하는데 sudo
액세스 권한이 필요합니다. 약 30개 이상의 서버가 있고 /etc/sudoers
수동으로 업데이트하는 것은 고통스러울 것입니다. 그래서 원격으로 업데이트할 수 있는 방법이 있는지 궁금합니다.
답변1
bash
원격 시스템에서 로컬 스크립트를 실행하고 스크립트를 공급하여 원격으로 실행할 수 있습니다.
$ ssh user@host 'bash -s' < script.sh
편집하다
sudo
원격 컴퓨터에서 사용해야 하는 명령을 실행하려면 ssh's
-t
옵션을 사용하고 명령을 에 전달 합니다 ssh
.-t
의사 터미널사용자가 ssh
비밀번호 입력과 같은 실행 명령과 상호 작용할 수 있도록 합니다.sudo
$ ssh user@host -t 'sudo foo'
sed
>
쉘 리디렉션은 허용되지 않으므로 파일을 수정하려면 리디렉션 대신 이 방법을 사용하는 것이 좋습니다 sudo
. 또한 명령의 모든 변수가 sed
에 전달됩니다 ssh
.
$ ssh user@host -t 'sudo sed -i "\$a text to insert" /path/to/file'
전체 프로세스를 자동화하려면:
#!/bin/bash
SERVERS=( server1 server2 server3 )
for HOST in ${SERVERS[@]}; do
ssh user@${HOST} -t 'sudo sed -i "\$a text to insert" /path/to/file'
if [[ $? -ne 0 ]]; then
echo "ERROR: $HOST did not complete"
else
echo "$HOST complete"
fi
done
답변2
tee
이 명령은 파일 리디렉션에 대한 sudo 제한을 피하는 데 도움이 된다는 것을 알았습니다 . sed를 사용하면 문자 이스케이프 요구 사항으로 인해 좌절감을 느꼈습니다.
이것은 클러스터에 있는 모든 시스템의 호스트를 /etc/hosts에 원격으로 연결하는 데 사용하는 명령입니다.
for i in {1..10}; do ssh [email protected].$i -t "echo '10.1.1.1 dev-1
10.1.1.4 dev-4
10.1.1.3 dev-3
10.1.1.2 dev-2
10.1.1.6 dev-6
10.1.1.8 dev-8
10.1.1.5 dev-5
10.1.1.10 dev-10
10.1.1.9 dev-9
10.1.1.7 dev-7' | sudo tee -a /etc/hosts >/dev/null"
각 반복의 출력은 다음과 같습니다.
0+1 records in
0+1 records out
255 bytes (255 B) copied, 4.1338e-05 s, 6.2 MB/s
SU의 이 답변은 최종 솔루션을 구축하는 데 매우 중요했습니다.https://superuser.com/a/1026359/587485
답변3
여러 명령을 실행하거나 리디렉션해야 하는 경우 다음 구문을 사용해야 합니다.
ssh server.com "sudo sh -c 'ps aux | grep jav > /root/1.txt'"
답변4
sudoers 파일을 수정하기 전에 직접 루트 비밀번호나 sudo 규칙에 의해 설정된 사용자 ID를 통해 일종의 루트 수준 액세스 권한이 이미 있어야 합니다.