sudo に変更するときに同じ作業ディレクトリに留まる

sudo に変更するときに同じ作業ディレクトリに留まる

コマンドラインで作業しているとき、 を使って 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`'を実行するので、 と評価されますが、もちろん何も達成されません。pwdcd /root

    ここでの唯一の問題は、コマンドを実行した直後に新しいシェルが終了することです。そのため、次を追加します。

  • -c "cd `pwd`; bash"これは、コマンドbashを実行した後に (新しいシェル)を実行することを意味しますcd。bash シェルは、ログアウトするまで終了しません。

`pwd`を に置き換えることができることに注意してください$(pwd)。機能的には同じですが、引用符のような文字が多すぎると読みにくくなる可能性があります。

答え3

私も同じ問題に直面しており、開発サーバー以外で何も実行できないためsudo su - devuser、次のような方法を考え出しました。

  1. devuser の .profile で、見つかった場合は以前のユーザー ホームに戻ります。
prev_user_home=$(~/bin/home.sh)
if [ -n $prev_user_home ] ; then
        cd $prev_user_home
fi
  1. 以前のユーザーを判別するスクリプト。スクリプトは 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 --

関連情報