web-dev-qa-db-ja.com

sudoで2つのコマンドを実行する方法は?

コマンドラインから2つのDb2コマンドを実行する方法はありますか? (これらはPHP execコマンドから呼び出されます。)

  1. db2 connect to ttt(2番目のコマンドの接続をライブにする必要があることに注意してください
  2. db2 UPDATE CONTACT SET EMAIL_ADDRESS = '[email protected]'

私はこれを試しました:

Sudo -su db2inst1 db2 connect to ttt; db2 UPDATE CONTACT SET EMAIL_ADDRESS = '[email protected]'

最初のコマンドは正しく終了しますが、2番目のコマンドはエラーメッセージSQL1024N A database connection does not exist. SQLSTATE=08003で失敗します

これをphpユーザーとして実行する必要があることに注意してください。コマンドSudo -u db2inst1 id as php userは、正しい出力を提供します。

143
Radek

Sudoは、シェルを介して複数のコマンドを実行できます。次に例を示します。

 $ Sudo -s-'whoami; whoami '
 root 
 root 

コマンドは次のようになります。

 sudo -u db2inst1 -s-"db2はtttに接続します; db2 UPDATE CONTACT SET EMAIL_ADDRESS = '[email protected]'" 

Sudoバージョンが-s付きのセミコロンで動作しない場合(明らかに、特定のオプションでコンパイルされた場合は動作しません)、使用できます

 sudo-sh -c 'whoami;私は誰'

代わりに、基本的に同じことを行いますが、シェルに明示的に名前を付けます。

146
wjl

コマンドについては、次の例を参照することもできます。

Sudo sh -c "whoami; whoami"

165
Jason

私は通常:

Sudo bash -c 'whoami; whoami'
42
Samer Atiani

引用符を処理する場合:

Sudo -s -- <<EOF
id
pwd
echo "Done."
EOF
40
Nebojša

代わりにevalを使用して、サブシェルの使用を避けます:

Sudo -s eval 'whoami; whoami'

注:引用符はbashに渡され、単一のコマンドとして実行されるため、Sudo -sを使用する他の回答は失敗します。 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
7
Cas

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

ターミナルで、次を入力します。

$ Sudo bash

次に、必要な数のコマンドを記述します。完了したら、exitと入力します。

自動化する必要がある場合は、script.shファイルを作成して実行します。

$ Sudo ./script.sh
1
Moshe Simantov

少し関連するトピックで、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のようなツールがより良い選択をします。

0
Eugene Chow

上記の回答では、引用内に引用することはできません。このソリューションは:

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

Umaskコマンドとmkdirコマンドの両方が「nobody」ユーザーで実行されます。

0
arberg