回答:
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
プロセスツリーを上に移動し、プロセス所有ユーザーが変更されたかどうかを確認します。