ssh를 사용하여 사용자로 로그인하고 루트로 변경하면 sudo가 필요하지 않습니다.

ssh를 사용하여 사용자로 로그인하고 루트로 변경하면 sudo가 필요하지 않습니다.

나는 다음과 같은 작업을 수행합니다.

  • 명령은 ssh를 통해 bash 스크립트의 루트로 서버에서 원격으로 실행되어야 하며 명령 출력은 변수에서 얻어야 합니다.
  • SSH를 통한 루트 로그인이 비활성화되었습니다.
  • 서버에서 sudo가 비활성화되어 있으므로 su를 사용해야 합니다.
  • 편집: bash에서 가능한 한 자동화하고 싶기 때문에 비밀번호는~ 해야 하다명령 내부에 저장됨

며칠 동안 인터넷 검색을 해봤지만 해결책을 찾지 못하는 것 같습니다.

여기에 제안된 솔루션:SSH로 서버에 접속하고 사용자를 전환하고 디렉터리를 변경합니다.

    ssh -t username@hostname "sudo su - otheruser -c \"cd /path/to/directory && command\""

서버에서 sudo가 비활성화되어 있으므로 작동하지 않습니다.

누구든지 해결책이 있습니까?

답변1

SSH를 통해(권한 없는 사용자로) 로그인하고 매개변수 없이 명령을 실행하여 su루트로 변경합니다. 이 작업을 수행하려면 루트 비밀번호가 필요합니다. 그런 다음 실행하려는 명령을 실행하십시오.
편집하다:한 줄로 이 작업을 수행하려면 다음 명령을 사용할 수 있습니다.
ssh username@hostname "su -c \"code_here\""
그래도 작동하지 않으면 passwd루트로 실행하여 루트 비밀번호를 활성화했는지 확인하십시오. 새 루트 비밀번호를 입력하라는 메시지가 표시됩니다.
추가의:루트가 아닌 사용자로 명령을 실행하려면(대상 사용자의 비밀번호가 필요함):
ssh username@hostname "su - username_of_target -c \"code_here\""

답변2

약간 주제에서 벗어난 것일 수도 있지만 Python과파라미코기준 치수:

#!/usr/bin/python2
import time
import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('127.0.0.1', port=22, username='user', password='pass')

stdin, stdout, stderr = ssh.exec_command('su')
time.sleep(0.1) # some enviroment maybe need this.
stdin.write('root_password_goes_here\n')

[ add extra code here to execute a command ]

stdin.flush()
print (stdout.readlines())
ssh.close()

스크립트에 비밀번호를 저장하는 것은 일반적으로 보안 관점에서 나쁜 생각이라는 점에 유의해야 합니다. 스크립트에 대한 적절한 권한을 설정했는지 확인하세요(예: chmod 740)

답변3

루트 비밀번호를 스크립트에 입력하는 대신 실행 파일을 사용하여 보안 문제를 줄일 수 있습니다 setuid.

setuid실행 파일은 어떤 사용자가 실행하는지에 관계없이 루트로 실행됩니다.

이것의 가장 큰 장점은 누군가가 귀하의 랩톱을 훔쳐갈 경우 smartctl -a /dev/sda루트로 실행할 수 있지만 그렇지 않은 경우에는 귀하의 사용자 권한만 가질 수 있다는 것입니다. 또는 나중에 언급되는 force 명령을 사용하여 공개 키를 설정하는 경우에는 훨씬 더 적습니다.

smartctl_wrapper.c다음과 같이 필요한 스크립트나 프로그램만 실행하는 간단한 C 프로그램을 작성하세요 .

#include <unistd.h>

int main() {
    //depending on your use case, you may want 
    //setuid(0), setgid(0), and/or setegid(0) here
    execl("/full/path/to/smartctl","smartctl","-a","/dev/sda",(char*) NULL);
}

로 컴파일합니다 gcc smartctl_wrapper.c -o smartctl_wrapper.

그런 다음 이를 실행할 수 있어야 하는 그룹과 루트에 속하도록 설정합니다. 다음 명령은 루트로 실행해야 합니다.

chown root:some_group smartctl_wrapper

그런 다음 실행 가능하게 만듭니다 setuid. 또한 모든 사용자가 편집하지 못하도록 방지할 수도 있습니다.

chmod 4510 smartctl_wrapper

some_group이제 이것은 루트 권한을 가진 모든 구성원이 비밀번호 없이 실행할 수 있는 실행 파일입니다 .

이제 ssh를 사용하여 간단히 실행할 수 있습니다.

ssh [email protected] /path/to/smartctl_wrapper

서버가 허용하는 경우 공개 키를 사용하여 SSH 연결을 설정하여 비밀번호 없는 연결을 허용할 수 있습니다. 당신은 또한 사용할 수 있습니다필수 주문따라서 이 키는 이 스크립트를 실행하는 것 외에는 쓸모가 없습니다.

서버가 이를 허용하지 않으면 SSH 비밀번호가 포함된 스크립트를 만들 수 있습니다. 이 경우에는 /sbin/nologin.

또는 특정 사용 사례의 경우 명령을 완전히 루트로 실행하지 않는 것이 더 합리적일 수 있습니다 ssh. 예를 들어, 이 명령이 주기적으로 실행되도록 예약하는 데 사용할 수 있습니다 cron. 다음 명령을 사용하여 루트의 crontab을 편집할 수 있습니다:

su -c crontab -e -u root

그리고 다음 줄을 추가하세요:

5 0 * * sun smartctl -a /dev/sda >> /some/path/to/log/some/non/root/user/can/read

주어진 줄은 일주일에 한 번, 일요일 자정 5분 후에 명령을 실행합니다. 아래 지침에 따라 원하는 대로 조정할 수 있습니다.예약된 작업(5).

ssh그런 다음 이를 사용하여 로그를 읽을 수 있습니다 .

답변4

그래서 4시간의 추가 웹 크롤링 끝에 마침내 성공했습니다!이에 대한 통찰력을 제공한 @jeroen-it-nerdbox에게 감사드립니다.

작업은 smartctl(루트 자격 증명 필요), ssh-root 비활성화 및 sudo 비활성화 서버에서 데이터를 가져오는 것입니다. 물론 이것은 su 대신 sudo에도 적용됩니다.

다음은 Paramiko 구현을 사용한 Python의 전체 작업 코드입니다.

#!/usr/bin/python2

import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('rootserver.domain.com', port=22, username='admin', password='adminpass')

stdin, stdout, stderr = ssh.exec_command('/bin/su root -c "smartctl -a /dev/sda > /tmp/smartctl_output"', get_pty=True)
stdin.write('rootpass\n')

stdin.flush()
print (stdout.readlines())
ssh.close()

관련 정보