2012-07-24 28 views
12

Tôi có tập lệnh shell cần tài khoản người dùng không phải root để chạy các lệnh nhất định và sau đó thay đổi người dùng thành root để chạy phần còn lại của tập lệnh. Tôi đang sử dụng SUSE11. Tôi đã sử dụng kỳ vọng tự động hóa lời nhắc mật khẩu. Nhưng khi tôi sử dụng spawn su - và lệnh được thực hiện, dấu nhắc quay trở lại với thư mục gốc và phần còn lại của tập lệnh không thực thi.Thay đổi thành người dùng root bên trong tập lệnh shell

Ví dụ:

< non-root commands> 
spawn su - 
<root commands> 

Nhưng sau su - lời nhắc trả về với người dùng là người chủ. Cách thực thi phần còn lại của tập lệnh.

Tùy chọn sudo -S không hỗ trợ vì nó không chạy lệnh sudo -S ifconfig mà tôi cần tìm địa chỉ IP của máy.

Tôi đã trải qua những liên kết này nhưng không thể tìm ra một giải pháp: Change script directory to user's homedir in a shell script

Changing unix user in a shell script

Cảm ơn trước

Trả lời

15

sudo sẽ làm việc ở đây nhưng bạn cần phải thay đổi bạn kịch bản một chút :

$ cat 1.sh 
id 
sudo -s <<EOF 
echo Now i am root 
id 
echo "yes!" 
EOF 

$ bash 1.sh 
uid=1000(igor) gid=1000(igor) groups=1000(igor),29(audio),44(video),124(fuse) 
Now i am root 
uid=0(root) gid=0(root) groups=0(root) 
yes! 

Bạn cần chạy c ommand trong khối <<EOF và cấp khối cho sudo.

Nếu muốn, bạn có thể sử dụng su, tất nhiên. Nhưng bạn cần phải chạy nó bằng cách sử dụng expect/pexpect sẽ nhập mật khẩu cho bạn.

Nhưng ngay cả trường hợp bạn có thể quản lý để nhập mật khẩu tự động (hoặc tắt) xây dựng này sẽ không hoạt động:

user-command 
su 
root-command 

Trong trường hợp này root-command sẽ được thực hiện với người sử dụng, chứ không phải với quyền root, vì nó sẽ được thực hiện sau khi su sẽ được hoàn thành (su mở một vỏ mới, không thay đổi uid của trình bao hiện tại). Bạn có thể sử dụng cùng một mẹo ở đây tất nhiên:

su -c 'sh -s' <<EOF 
# list of root commands 
EOF 

Nhưng bây giờ bạn có cùng với sudo.

1

Cách dễ nhất để làm điều đó là tạo ít nhất hai tập lệnh.

Người đầu tiên nên gọi người thứ hai có đặc quyền root. Vì vậy, mọi lệnh bạn thực thi trong tập lệnh thứ hai sẽ được thực hiện dưới dạng root.

Ví dụ:

runasroot.sh

sudo su-c'./scriptname.sh' 

Tập lệnh.sh

apt-get install mysql-server-5.5 

hoặc bất cứ thứ gì bạn cần.

+0

Điều gì xảy ra nếu, thay vì root, hãy gọi nó là $ USERNAME2? Cảm ơn trước. – raja777m

8

Có một cách dễ dàng để thực hiện điều đó mà không cần tập lệnh thứ hai. Chỉ cần đặt phần này vào đầu tệp của bạn:

if [ "$(whoami)" != "root" ] 
then 
    sudo su -s "$0" 
    exit 
fi 

Sau đó, nó sẽ tự động chạy dưới dạng gốc. Tất nhiên, điều này giả định rằng bạn có thể sudo su mà không cần phải cung cấp một mật khẩu - nhưng đó là ngoài phạm vi của câu trả lời này; xem một trong những câu hỏi khác về cách sử dụng sudo trong các kịch bản lệnh shell để biết cách thực hiện điều đó.

+0

Hãy cẩn thận; '" $ 0 "' [có thể không phải là những gì bạn nghĩ là] (http://mywiki.wooledge.org/BashFAQ/028). – ELLIOTTCABLE

+1

@ELLIOTTCABLE Điều đó thật thú vị, nhưng tôi giả định ở đây rằng $ 0 là lệnh để bắt đầu quá trình hiện tại, không phải đường dẫn đến tệp hiện tại, do đó, nó hơi ít mong manh. Tuy nhiên, một điểm tốt và liên kết rất hữu ích. – Benubird

+0

cho lời nhắc mật khẩu chỉ sử dụng 'echo $ PASSWORD | sudo -S su -c "$ 0" – Leathan

Các vấn đề liên quan