programing

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

easyjava 2023. 5. 9. 23:11
반응형

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

명령줄에서 두 의 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사용자. 명령어sudo -u db2inst1 idphp 사용자가 나에게 정확한 출력을 제공합니다.

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

sudo sh -c 'whoami; whoami'

sudo는 셸을 통해 다음과 같은 여러 명령을 실행할 수 있습니다.

sudo-s -- '와미; 와미'뿌리뿌리

명령은 다음과 같습니다.

sudo - udb2inst1 -s -- "db2 connect to ttt; db2 UPDATE CONTACT SET EMAIL_ADDRESS = 'mytestaccount@gmail.com '"

sudo 버전이 -s를 가진 세미콜론과 함께 작동하지 않는 경우(특정 옵션으로 컴파일된 경우에는 작동하지 않음),

sudo -- sh -c 'whoami; whoami'

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

인용문을 처리하려면 다음을 수행합니다.

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

주로 하는 일은:

sudo bash -c 'whoami; whoami'

대체 용도:eval서브셸의 사용을 피합니다.

sudo -s eval 'whoami; whoami'

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

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

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

또한 실패할 경우 명령 실행을 중지해야 하는 경우 세미콜론 대신 이중 앰퍼샌드를 사용합니다.

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

-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;'

터미널에서 다음을 입력합니다.

$ sudo bash

그런 다음 원하는 만큼의 명령을 작성합니다.유형exit당신이 끝났을 때.

자동화가 필요한 경우에는script.sh파일 작성 및 실행:

$ sudo ./script.sh

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

예를 들어 Ubuntu의 경우,

$ 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과 같은 도구가 더 나은 선택을 할 수 있습니다.

루트 암호를 알고 있는 경우 시도할 수 있습니다.

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

위의 답변은 인용문 내에서 인용할 수 없습니다.이 솔루션은 다음과 같습니다.

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

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

이것은 여러 라인에서 잘 작동하는 깨끗한 솔루션입니다.

sudo bash -c """
id
echo "testing"
"""

언급URL : https://stackoverflow.com/questions/5560442/how-to-run-two-commands-with-sudo

반응형