web-dev-qa-db-ja.com

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

コマンドラインで作業するときは、Sudo -iを使用してSudoに変更することがよくあります。ただし、私の作業ディレクトリは自動的に/rootに変更されます。私はそこに行きたくありません。どこにいても居たい!どうすればこれを達成できますか?

27
User402841

代わりに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に関する背景情報 があります。

29
Levon

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)で置き換えることができることに注意してください。機能的には同じですが、引用のような文字が多いと読みにくくなる場合があります。

8
will.barley

私は同じ問題に直面し、開発サーバーで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

プロセスツリーを上に移動し、プロセス所有者のユーザーが変更されたかどうかを確認します。

0
reimai