원격 서버에서 루트로 변경을 수행하려면 어떻게 해야 합니까?

원격 서버에서 루트로 변경을 수행하려면 어떻게 해야 합니까?

원격 컴퓨터에서 루트로 수정하지 않고 로컬 컴퓨터에서 스크립트/명령을 실행할 수 있는 방법이 있는지 궁금합니다.

일부 배경

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를 통해 일종의 루트 수준 액세스 권한이 이미 있어야 합니다.

관련 정보