コマンドラインで作業するとき、私はしばしば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`; バッシュ"
ここで何が起こっていますか?
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
作業ディレクトリへのアクセス権がないユーザーになると、新しいユーザーは作業ディレクトリで読み取り/書き込み操作を実行できません。
または、作業ディレクトリのルートになります。
sudo su --