回答:
sudo -s代わりに使用できます。現在のディレクトリはに変更されません/rootが、環境変数の一部はルートの環境変数ではありません。
Ubuntuフォーラムのこのページには、素晴らしい要約があります。
Summary of the differences found
corrupted by user's
HOME=/root uses root's PATH env vars
sudo -i Y Y[2] N
sudo -s N Y[2] Y
sudo bash N Y[2] Y
sudo su Y N[1] Y
sudo -iu私の作品ubuntuforums.org/...
sudo -iはまだユーザーのenv varsによって破損しています。これを避ける唯一の方法はを使用することsu -lです。
を使用する場合suは、同じディレクトリにとどまる方法があります。
su- user -c "cd` pwd`; bash "
何が起きてる:
su - user =としてログイン user-c これは、「新しいユーザーのシェルでコマンドを実行する」ことを意味します-c "cd `pwd`"提供するコマンドは現在のディレクトリ(`pwd`)に切り替えることです。ただし、二重引用符でバッククォートを使用するため、pwdコマンドを実行する前に評価されますsu、実際に現在のディレクトリに切り替えます。ユーザー。
-c 'cd `pwd`'を実行するpwdため、これは次のように評価されます。cd /root、もちろん何も実行されません。ここでの唯一の問題は、コマンドを実行した直後に新しいシェルが終了するため、次のように追加します。
-c "cd `pwd`; bash"つまり、「実行bash後(新しいシェル)を実行しますcdコマンドのます。bashシェルは、ログアウトするまで終了しません。あなたは置き換えることができることを注意`pwd`して$(pwd)。機能的には同じですが、大量の引用符のような文字は読みにくくなる可能性があります。
私は同じ問題に直面しており、私は他のものを実行することはできません sudo su - devuser、開発サーバーでので、これが私が思いついたものです:
prev_user_home=$(~/bin/home.sh)
if [ -n $prev_user_home ] ; then
cd $prev_user_home
fi
#!/bin/bash
#brings you back home after sudo su
function get_owner {
pid=$1
echo $(ps ouid -p $pid h | tr -d ' ')
}
pid=$$
my_uid=$(get_owner $pid)
uid=$my_uid
i=0
while [[ $uid == $my_uid && $i -lt 20 ]] ; do
pid=$(ps -o ppid= $pid)
uid=$(get_owner $pid)
i=$((i+1))
done
user_home=$(getent passwd $uid | cut -d ':' -f '6')
if [[ -d $user_home && $uid != 0 ]] ; then
echo $user_home
fi
プロセスツリーを上に移動し、プロセス所有ユーザーが変更されたかどうかを確認します。