コマンドラインで作業するときは、Sudo -i
を使用してSudoに変更することがよくあります。ただし、私の作業ディレクトリは自動的に/root
に変更されます。私はそこに行きたくありません。どこにいても居たい!どうすればこれを達成できますか?
代わりにSudo -s
を使用できますが、現在のディレクトリが/root
に変更されることはありませんが、一部の環境変数はrootのものではありません。
これは、Ubuntuフォーラムの page に要約されています。
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
Ubuntuのドキュメントからのこのページには、はるかに多くの Sudoに関する背景情報 があります。
su
を使用する場合は、同じディレクトリにとどまる方法があります。
su- ユーザー -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
プロセスツリーを上に移動し、プロセス所有者のユーザーが変更されたかどうかを確認します。