sudo -i
เมื่อทำงานในบรรทัดคำสั่งผมมักจะเปลี่ยนไปใช้ sudo /root
อย่างไรก็ตามไดเรกทอรีการทำงานของฉันเปลี่ยนแปลงโดยอัตโนมัติ ฉันไม่ต้องการไปที่นั่น ฉันต้องการที่จะอยู่ในที่ที่ฉันอยู่! ฉันจะบรรลุสิ่งนี้ได้อย่างไร
sudo -i
เมื่อทำงานในบรรทัดคำสั่งผมมักจะเปลี่ยนไปใช้ sudo /root
อย่างไรก็ตามไดเรกทอรีการทำงานของฉันเปลี่ยนแปลงโดยอัตโนมัติ ฉันไม่ต้องการไปที่นั่น ฉันต้องการที่จะอยู่ในที่ที่ฉันอยู่! ฉันจะบรรลุสิ่งนี้ได้อย่างไร
คำตอบ:
คุณสามารถใช้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
sudo -iu
ทำงานได้สำหรับฉันubuntuforums.org/…
sudo -i
ยังคงเสียหายโดย env vars ของผู้ใช้ su -l
วิธีที่จะหลีกเลี่ยงการนี้คือการใช้งาน
หากคุณต้องการใช้su
มีวิธีอยู่ในไดเรกทอรีเดียวกัน
su - ผู้ใช้ -c "cd` pwd`; bash "
เกิดอะไรขึ้นที่นี่:
su - user
= เข้าสู่ระบบเป็น user
-c
ซึ่งหมายถึง "เรียกใช้คำสั่งในเชลล์ผู้ใช้ใหม่"-c "cd `pwd`"
คำสั่งที่เราให้คือการสลับไปยังไดเรกทอรีปัจจุบัน ( `pwd`
) - แต่เนื่องจากเราใช้ backticks ในเครื่องหมายคำพูดคู่คำpwd
สั่งจะถูกประเมินก่อนที่เราจะเรียกใช้su
คำสั่งเพื่อให้เราเปลี่ยนไปยังไดเรกทอรีที่เราอยู่ในตอนนี้เหมือนเก่า ผู้ใช้งาน
-c 'cd `pwd`'
จะรันpwd
คำสั่งในเชลล์ใหม่ดังนั้นสิ่งนี้จะประเมินcd /root
ว่าแน่นอนว่าจะไม่ทำอะไรให้สำเร็จปัญหาเดียวที่นี่คือเชลล์ใหม่ออกทันทีหลังจากรันคำสั่งดังนั้นเราจึงเพิ่ม:
-c "cd `pwd`; bash"
ซึ่งหมายถึง "run bash
(new shell) หลังจากรันcd
คำสั่ง bash shell ไม่ออกจนกว่าเราจะออกจากระบบโปรดทราบว่าคุณสามารถแทนที่ด้วย`pwd`
$(pwd)
พวกมันใช้งานได้เหมือนกัน แต่ตัวละครที่มีเครื่องหมายคำพูดมากมายสามารถอ่านได้ยาก
ฉันประสบปัญหาเดียวกันและฉันไม่ได้รับอนุญาตให้ทำงานอย่างอื่นนอกจากsudo su - devuser
เซิร์ฟเวอร์ dev ดังนั้นนี่คือสิ่งที่ฉันได้รับ:
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
มันจะเพิ่มแผนผังกระบวนการและตรวจสอบว่ากระบวนการที่เป็นเจ้าของผู้ใช้เปลี่ยน