Câu trả lời:
Bạn có thể sử dụng sudo -s
thay vào đó, nó sẽ không thay đổi thư mục hiện tại của bạn /root
, mặc dù một số biến môi trường của bạn sẽ không phải là của root.
Đây trang từ Diễn đàn Ubuntu có một bản tóm tắt tốt đẹp:
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
Trang này từ tài liệu của Ubuntu có nhiều thông tin cơ bản hơn về sudo .
sudo -iu
làm việc cho tôi ubuntuforums.org/
sudo -i
vẫn bị hỏng bởi các vv env của người dùng. Cách duy nhất để tránh điều này là sử dụng su -l
.
Nếu bạn muốn sử dụng su
, có một cách để ở trong cùng một thư mục.
su - người dùng -c "cd` pwd`; bash "
Những gì đang xảy ra ở đây:
su - user
= đăng nhập như user
-c
có nghĩa là "chạy một lệnh trong trình bao mới của người dùng"-c "cd `pwd`"
lệnh chúng tôi đưa ra là để chuyển sang thư mục hiện tại ( `pwd`
) - nhưng vì chúng tôi sử dụng backticks trong dấu ngoặc kép, nên pwd
lệnh được ước tính trước khi chúng tôi chạy su
lệnh, để chúng tôi thực sự chuyển sang thư mục chúng tôi đang ở NGAY như cũ người sử dụng.
-c 'cd `pwd`'
sẽ thực thi pwd
lệnh trong shell mới, do đó, điều này sẽ đánh giá cd /root
, tất nhiên, sẽ không hoàn thành bất cứ điều gì.Vấn đề duy nhất ở đây là shell mới thoát ngay sau khi chạy lệnh, vì vậy sau đó chúng tôi thêm:
-c "cd `pwd`; bash"
có nghĩa là "chạy bash
(shell mới) sau khi chạy cd
lệnh. Shell bash không thoát cho đến khi chúng ta đăng xuất khỏi nó.Lưu ý rằng bạn có thể thay thế `pwd`
bằng $(pwd)
. Chúng có chức năng giống nhau, nhưng sự phong phú của các ký tự giống như trích dẫn có thể trở nên khó đọc.
Tôi đã đối mặt với cùng một vấn đề và tôi không được phép chạy bất cứ thứ gì ngoài sudo su - devuser
máy chủ dev, vì vậy đây là những gì tôi nghĩ ra:
prev_user_home=$(~/bin/home.sh)
if [ -n $prev_user_home ] ; then
cd $prev_user_home
fi
#!/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
Nó đi lên một cây quy trình và kiểm tra xem người dùng sở hữu quy trình có thay đổi hay không.