sudo에서 두 개의 명령을 실행하는 방법은 무엇입니까?


152

명령 줄에서 두 개의 Db2 명령을 실행하는 방법이 있습니까? (PHP exec명령 에서 호출됩니다 .)

  1. db2 connect to ttt (두 번째 명령을 위해서는 연결이 활성화되어 있어야합니다.
  2. db2 UPDATE CONTACT SET EMAIL_ADDRESS = 'mytestaccount@gmail.com'

나는 이것을 시도했다 :

sudo -su db2inst1 db2 connect to ttt; db2 UPDATE CONTACT SET EMAIL_ADDRESS = 'mytestaccount@gmail.com'

첫 번째 명령은 올바르게 완료되지만 두 번째 명령은 오류 메시지와 함께 실패합니다 SQL1024N A database connection does not exist. SQLSTATE=08003

이것을 PHP 사용자로 실행해야합니다. PHP 사용자 sudo -u db2inst1 id로서의 명령 은 올바른 출력을 제공합니다.


이 질문을 닫으려는 이유는 의견을 남겨주십시오. 감사합니다.
Radek

1
프로그래밍 오류가 아닌 시스템 관리 문제이므로 serverfault 로의 마이그레이션에 대한 찬성 투표가 이루어집니다.
bdonlan

답변:


157

sudo는 쉘을 통해 여러 명령을 실행할 수 있습니다. 예를 들면 다음과 같습니다.

$ sudo -s- 'whoami; 우와 미
뿌리
뿌리

당신의 명령은 다음과 같습니다.

sudo -u db2inst1 -s- "db2는 ttt에 연결; db2 업데이트 연락처 세트 EMAIL_ADDRESS = 'mytestaccount@gmail.com'"

sudo 버전이 -s를 사용하는 세미콜론에서 작동하지 않는 경우 (특정 옵션으로 컴파일 된 경우에는 작동하지 않음)

sudo-sh -c 'whoami; 우와 미

대신 기본적으로 동일한 작업을 수행하지만 쉘의 이름을 명시 적으로 지정합니다.


12
이것은 최신 데비안 스 테이블 (압착) 배쉬에서는 작동하지 않습니다 :sudo -s -- '/usr/bin/whoami; /usr/bin/whoami' /bin/bash: /usr/bin/whoami; /usr/bin/whoami: No such file or directory
Valor

11
@Valor sudo -- sh -c 'whoami; whoami;"sudo -s"가 깨졌을 때 해결 방법으로 사용할 수 있습니다 . 답변도 업데이트했습니다.
wjl

6
"-sh -c"예제를 보여주는 편집 된 버전의 경우 +1 감사!
JD.

4
왜 "-"가 필요한지 설명해 주시겠습니까?
빅 Seedoubleyew

7
@VicSeedoubleyew --매개 변수의 끝을로 나타내 sudo므로 다른 모든 것은 명령의 일부입니다. 그것 없이는 같은 인수 -c는에 대한 인수로 해석 될 수 있습니다 sudo. 이것은 대부분의 명령 행 프로그램에서 작동합니다. 또 다른 (비의 경우 sudo) 예,라는 파일을 제거합니다 -f그냥 실행할 수 없습니다를 rm -f, 오른쪽?! 그러나 rm -- -f이라는 파일을 삭제하기 위해 실행할 수 있습니다 -f.
wjl

176

명령에 대해서는 다음 예제를 참조 할 수도 있습니다.

sudo sh -c 'whoami; whoami'


14
나는 이것이 더 신뢰할만한 대안을 찾았다.
Nick


42

따옴표를 처리하려면 다음을 수행하십시오.

sudo -s -- <<EOF
id
pwd
echo "Done."
EOF

4
이것은 가장 깨끗한 대답입니다. 감사합니다. 어쩌면 "여러 명령을 실행할 수 없습니다 sudo-매개 변수로 실행하기 위해 여러 명령을 받아 들일 수있는 쉘을 실행하도록 속이려 야합니다"
trs

8

eval서브 쉘 사용을 피하는 대안 :

sudo -s eval 'whoami; whoami'

참고 : sudo -s따옴표가 bash에 전달되고 단일 명령으로 실행되므로 eval로 따옴표를 제거해야하기 때문에 실패를 사용하는 다른 답변 . eval더 나은 설명이 SO 답변입니다

명령 내에서 인용하는 것도 쉽습니다.

$ sudo -s eval 'whoami; whoami; echo "end;"'
root
root
end;

명령이 실패하면 명령을 중지해야하는 경우 세미콜론 대신 이중 앰퍼샌드를 사용하십시오.

$ sudo -s eval 'whoami && whoamit && echo "end;"'
root
/bin/bash: whoamit: command not found

3

-s옵션은 나를 위해 작동하지 않았다 -i않았다.

다음은 내 bash에서 로그 크기를 업데이트하는 방법의 예입니다.

sudo -u [user] -i -- sh -c 'db2 connect to [database name];db2 update db cfg for [database name] using logsecond 20;db2 update db cfg for [database name] using logprimary 20;'

1

터미널에서 다음을 입력하십시오.

$ sudo bash

그런 다음 원하는만큼 명령을 작성하십시오. exit완료했을 때 입력하십시오 .

자동화해야하는 경우 script.sh파일을 작성 하고 실행하십시오.

$ sudo ./script.sh

1

약간 관련된 주제에서 SSH를 통해 동일한 다중 명령 sudo를 원했지만 위의 어느 것도 작동하지 않았습니다.

예를 들어 우분투에서는

$ ssh host.name sudo sh -c "whoami; whoami"
[sudo] password for ubuntu:
root
ubuntu

여기서 발견 된 요령 은 명령을 큰 따옴표로 묶는 것입니다.

$ ssh host.name sudo sh -c '"whoami; whoami"'
[sudo] password for ubuntu:
root
root

다른 옵션도 작동합니다.

ssh host.name sudo sh -c "\"whoami; whoami\""
ssh host.name 'sudo sh -c "whoami; whoami"'

SSH가 실행되는 클라이언트 쉘이 가장 바깥 쪽 따옴표를 제거한다고 생각하기 때문에 원칙적으로 큰 따옴표가 필요합니다. 따옴표를 필요에 맞게 혼합하고 일치시킵니다 (예 : 변수를 전달해야 함). 그러나 원격 명령이 복잡한 경우 특히 따옴표가있는 YMMV. 이 경우 Ansible과 같은 도구가 더 나은 선택입니다.


1

루트 암호를 알고 있다면 시도해 볼 수 있습니다

su -c "<command1> ; <command2>"  

루트 암호를 모르면를 사용하십시오 sudo su -c "<command1> ; <command2>" .
Dag Høidahl

0

위의 답변으로 따옴표 안에 인용 할 수 없습니다. 이 솔루션은 :

sudo -su nobody umask 0000 \; mkdir -p "$targetdir"

umask 명령과 mkdir 명령은 모두 'nobody'사용자와 함께 실행됩니다.


작은 따옴표와 큰 따옴표를 사용하여 이스케이프 처리 할 수 ​​있습니다.
Radek

자,이 명령에서 umask를 무엇으로 설정 했어도 효과가 없습니까?
Michael
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.