
コマンドラインで作業しているとき、 を使って sudo に変更することがよくありますsudo -i
。しかし、作業ディレクトリは自動的に に変更されます。/root
そこへは行きたくありません。前にいた場所に留まりたいのです。どうすればこれを実現できますか?
答え1
代わりにを使用することもできますがsudo -s
、現在のディレクトリは に変更されませんが/root
、環境変数の一部は 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
Ubuntuのドキュメントのこのページにはさらに多くの情報が記載されていますsudo の背景情報。
答え2
を使用したい場合は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)
。機能的には同じですが、引用符のような文字が多すぎると読みにくくなる可能性があります。
答え3
私も同じ問題に直面しており、開発サーバー以外で何も実行できないためsudo su - devuser
、次のような方法を考え出しました。
- devuser の .profile で、見つかった場合は以前のユーザー ホームに戻ります。
prev_user_home=$(~/bin/home.sh)
if [ -n $prev_user_home ] ; then
cd $prev_user_home
fi
- 以前のユーザーを判別するスクリプト。スクリプトは devuser の bin ディレクトリに配置されます。
#!/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
プロセス ツリーを上って、プロセスを所有するユーザーが変更されたかどうかを確認します。
答え4
両方のユーザーが作業ディレクトリにアクセスできる場合:
sudo su -- $USER
作業ディレクトリへのアクセス権を持たないユーザーになった場合、新しいユーザーは作業ディレクトリ内で読み取り/書き込み操作を実行できないことに注意してください。
または、作業ディレクトリで root になるには:
sudo su --