bash에서 ssh와 sudo를 함께 사용하는 방법은 무엇입니까?


10

이 특정 시나리오를 설명하는 질문을 찾지 못했습니다.

여러 컴퓨터에서 로깅을 검색하기 위해 매우 기본적인 bash 스크립트를 실행하려고합니다. 스크립트를 로컬로 실행하고 있지만 ssh를 통해 외부 컴퓨터에 액세스하고 해당 컴퓨터에서 권한이있는 사용자에게 sudo를 한 번 실행해야합니다 ...

ssh myuser@machine.net
sudo su  - privledged_user
cat logs > file.txt

sh -x로 이것을 실행하면 bash가 'ssh'줄에 붙어 있습니다. 그래서 나는 이것을 다음과 같이 수정하려고 시도했다.

ssh myuser@machine.net sudo su - privledged_user cat logs > file.txt

이것은 또한 무기한으로 멈추는 것처럼 보입니다. 이 문제에 대한 더 나은 해결책이 있습니까 ?? 내가 말할 수있는 것에서 sudo su를 사용하는 방법을 보지 못했습니다 ...

도움을 주셔서 감사합니다!


왜 가까운 투표? 이 질문은 주제입니다 : 서버, 워크 스테이션, 스토리지 또는 네트워크의 하드웨어 또는 소프트웨어 관리, 관리, 모니터링 또는 자동화에 사용되는 도구
jlliagre

답변:


5

현재 환경에서 이것을 달성하는 방법 -t은 다음과 같이 tty 할당을 강제 하는 플래그로 ssh를 실행 하고 그 안에 sudo -u root를 실행하는 것입니다.

ssh -t hostname << EOF
  command1
  sudo -u root command2
  sudo -u otheruser "command3 | command4"
  sudo -u root /bin/bash -c "command5; command6; command7"
  command8 && ( sudo -u otheruser /bin/bash -c "cmd1 ${1}; cmd2 {$2}" ) || echo cmd2 did not work

EOF

암호가 필요하지 않도록 원격 측의 sudoers에 내 계정이 있습니다.

이 예는 bash 또는 서브 쉘 내에서 여러 명령을 실행하는 것을 포함하여 단일 ssh 세션 내에서이를 수행하는 다양한 방법을 보여줍니다. 또한 위의 코드를 실행 가능 스크립트에 넣으면 명령 줄 인수 ($ 1 및 $ 2)를 ssh에 전달하면 확장되어 원격에서 참조됩니다.


불행히도 원격 서버를 관리하지 않기 때문에 sudo su를 사용하고 있다고 생각 합니다. 그래도이 형식으로 작동합니까?
Matt124234

예, 작동합니다. 프롬프트가 표시되면 비밀번호를 입력 할 수 있습니다.
Michael Martinez

나는 시도했다 : ssh -t mrhyner@stg-app3.indeed.net << EOF sudo su-adcentrl egrep 'ERROR \ | WARN'/ home / adcentrl / cronjobs / logs / * / * EOF 그러나 나는 받았다 : "Pseudo stdin이 터미널이 아니므로 터미널이 할당되지 않습니다. "
Matt124234

완벽하게 좋아. 그 경고를 무시하고 진행하십시오. 원한다면 / etc / sudoers에서 "RequireTty"를 비활성화 할 수 있습니다
Michael Martinez

5

sudo가 암호를 묻는 것을 원하지 않거나 막을 수없는 경우 간단한 방법은 로컬 에서 암호를 읽고 로컬 변수에 저장하는 것입니다.

read -p 'Password: ' -s password

ssh -t user@1.2.3.4 <<EOF
  echo "$password" | sudo -S whoami
EOF

1

sudo가 암호없는 명령을 허용하도록 구성된 경우 원하는 작업을 수행해야합니다.

ssh myuser@machine.net "sudo su - privileged_user -c 'cat logs'" > file.txt

또는

ssh myuser@machine.net "sudo su - privileged_user -c 'cat logs > file.txt'"

file.txt로컬 또는 원격으로 파일을 만들지 여부에 따라

그렇지 않으면 다음은 원격 사용자의 비밀번호를 sudo다음 으로 전달하는 방법입니다 .

echo mrhyner_password | \
  ssh mrhyner@test-server.net \
  "sudo -S su - adcentrl -c 'egrep ERROR\|WARN /home/adcentrl/cronjobs/logs/*/*'"

매우 흥미로운. 그러나 -t없이 ssh를 사용하면 "tty tty 없음"을 알려줍니다. -t를 추가하면이 오류가 제거되지만 비밀번호를 묻는 메시지가 표시되면 'sudo su'를 따르지 않는 것 같습니다. 여기 내가 구체적으로하고있는 일이 있습니다 : ssh -t mrhyner@test-server.net "sudo su-adcentrl -c egrep"ERROR \ | WARN "/ home / adcentrl / cronjobs / logs / * / *"이것은 나에게 제공합니다 : bash : WARN : 명령을 찾을 수 없음 mrhyner의 [sudo] 비밀번호 :
Matt124234

죄송합니다.이 의견에 주석을 작성하는 방법을 모르는 것 같습니다.
Matt124234

sudo가 원격 계정에 대해 암호가 없도록 구성되었다고 가정했습니다.
jlliagre 2016

작은 따옴표가 없습니다.
jlliagre

bash가 어떤 이유로 ssh 명령을 존중하지 않는다고 추론했습니다. 내 로컬 호스트 = \에서 sudo를 위해 노력하고있어 것처럼 행동하는 것
Matt124234
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.