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
มันจะเพิ่มแผนผังกระบวนการและตรวจสอบว่ากระบวนการที่เป็นเจ้าของผู้ใช้เปลี่ยน