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


25

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

回答:


28

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

Ubuntuのドキュメントのこのページには、sudoに関するより多くの背景情報があります。


1
綺麗な!たくさんの、シンプルだが素晴らしい小さな概要に感謝します!
モニカを

@ user1162541お手伝いできて嬉しいです。
レボン

sudo -iu私の作品ubuntuforums.org/...
rofrol

私のテスト中、env vars sudo -iはまだユーザーのenv varsによって破損しています。これを避ける唯一の方法はを使用することsu -lです。
シンバ

5

を使用する場合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)。機能的には同じですが、大量の引用符のような文字は読みにくくなる可能性があります。


0

私は同じ問題に直面しており、私は他のものを実行することはできません 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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.