コマンドラインから2つのDb2コマンドを実行する方法はありますか? (これらはPHP exec
コマンドから呼び出されます。)
db2 connect to ttt
(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は、正しい出力を提供します。
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;私は誰'
代わりに、基本的に同じことを行いますが、シェルに明示的に名前を付けます。
コマンドについては、次の例を参照することもできます。
Sudo sh -c "whoami; whoami"
私は通常:
Sudo bash -c 'whoami; whoami'
引用符を処理する場合:
Sudo -s -- <<EOF
id
pwd
echo "Done."
EOF
代わりに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
-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のようなツールがより良い選択をします。
上記の回答では、引用内に引用することはできません。このソリューションは:
Sudo -su nobody umask 0000 \; mkdir -p "$targetdir"
Umaskコマンドとmkdirコマンドの両方が「nobody」ユーザーで実行されます。