#!/bin/ksh
(some code)
Log=~/my.log
chown USER1 filename
su - USER1 -c "
date | tee -a ${Log} 2>&1;
cd /blah/blah
if [ SOMECONDITION ]
then
sh ./somescript.ksh > logfile
fi
exit" | tee -a ${Log} 2>&1;
スクリプトがUSER1に切り替えられると、停止してから手動で終了する必要があるときに再実行される傾向があります。
答え1
パスワードの入力を求められますが、パスワードを取得できないため、「su」コマンドでスクリプトを停止したいと思います。
通常、いくつかの解決策があります:)
標準入力でパスワードを許可する-Sスイッチ付きの「su」の代わりに「sudo」を使用してください。
echo "password" | sudo -S -u USER1 sh -c "...
または、他のユーザーとして実行する必要があるアプリケーション/スクリプトの一部をヘルパーアプリケーションに移動します。その後、ヘルパーアプリケーションでset-uidとset-gidを使用して、保存されたプレーンテキストパスワード(一部のセキュリティ上の問題がある)でスクリプトを防ぐことができます。
chown USER1.GRP1 helperapp
chmod 6755 helperapp
これにより、システム内の誰でもUSER1でhelperappを実行できるというリスクがあります。 set-uid/gid を使用することに加えて、特定のユーザーがパスワードプロンプトなしで het helperapp を USER1 として実行できるようにするには、sudo 構成を使用できます (管理者/root 権限が必要)。
# /etc/sudoers
# Allow USER2 to run helperapp as USER1 without prompting for a password
USER2 ALL=(USER1) NOPASSWD:/path/to/helperapp
その後、コードは次のようになります。
#!/bin/ksh
(some code)
Log=~/my.log
chown USER1 filename
sudo -u USER1 /path/to/helperapp | tee -a ${Log} 2>&1;
これはテストされていないため、使用上の責任はユーザー自身にあります。
答え2
を実行しているため、ログインシェルを実行するように求められますsu -
。su
ログインシェルは-c
引数を無視し、インタラクティブにコマンドを読み込みます。解決策は合格しないことです-
。
ターゲットユーザーの起動ファイルを読み取るには、明示的に実行します。
su - USER1 <<EOF
date
if [ -e ~/.profile ]; then . ~/.profile; fi
…
EOF 2>&1 | tee -a -- "$LOG"