[英]Use sudo without password INSIDE a script
出於某種原因,作為用戶,我需要在沒有 sudo 的情況下運行需要 root 權限才能工作的腳本 script.sh。
我認為這是將 sudo 放入 script.sh 的唯一解決方案。 讓我們舉個例子:
script.sh :
#!/bin/sh
sudo apt-get update
當然,如果我執行這個腳本,我會得到一個提示,要求我輸入密碼。 然后我添加到我的 sudoers 文件(最后覆蓋其他所有內容):
user ALL=(ALL:ALL) NOPASSWD:/path/to/script.sh
順便說一句,我也試過這條線:
user ALL=(ALL) NOPASSWD:/path/to/script.sh
(我想我沒有完全理解其中的區別)
但是,如果我不使用 sudo 執行此腳本,這並不能解決我的問題:
# ./script.sh
[sudo] password for user:
# sudo ./script.sh
Starts updating...
好吧,所以我對自己說:“好吧,這意味着如果我像我一樣在 sudoers 中引用了一個文件,只有當我用 sudo 調用他時,它才會在沒有提示的情況下工作,這不是我想要的”。
所以,好的,我創建另一個腳本 script2.sh 如下:
script2.sh
#!/bin/sh
sudo /path/to/script.sh
事實上它有效。 但是我對這個解決方案並不真正滿意,特別是因為我必須為每個命令使用 2 個腳本。
這篇文章是為了幫助遇到這個問題的人並尋找相同的解決方案(我沒有找到一個好的帖子),也許你們有更好的解決方案。
隨意分享您的想法!
編輯 1:
我想堅持這樣一個事實,即這個“apt-get update”只是我的腳本實際情況的一個示例。 我的腳本有很多命令(有一些 cd 到 root-access-only 配置文件),解決方案不能是“好吧,直接用 apt-get 來做”。
舉例的原則是幫助理解,而不是作為簡化一般問題答案的借口。
從我的博客: IDMRockstar.com :
關鍵是有時,我需要以 root 身份運行命令。 這是我在不泄露密碼的情況下完成的快速而骯臟的方式:
#! /bin/bash
read -s -p "Enter Password for sudo: " sudoPW
echo $sudoPW | sudo -S yum update
這樣,用戶會被提示輸入密碼(並從終端隱藏),然后根據需要傳遞給命令,所以我不會以 root 身份運行整個腳本 =)
如果你有更好的方法,我很想聽聽! 無論如何,我都不是 shell 腳本專家。
干杯!
。: 亞當
如果你想在沒有密碼的情況下運行sudo /usr/bin/apt-get update
,你需要有 sudoers 條目:
user ALL=(ALL:ALL) NOPASSWD:/usr/bin/apt-get update
對於整個腳本的較大問題,有兩種可能的方法:
對於腳本中需要sudo
每個命令,請在sudoers
專門為該命令創建一行。 在這種情況下,腳本可以正常調用:
./script1.sh
在sudoers
為整個腳本放置一行。 完成后,各個命令不需要sudo
。 但是,必須使用sudo
來啟動腳本,如下所示:
sudo ./script.sh
如果您的密碼不是您想要非常安全的東西,(可能是公司中的某些測試服務器等),您可以通過 echo 在腳本中提升為 sudo ,例如:
echo YourPasswordHere | sudo -S Command
盡管如此,提示仍會打印“輸入密碼”文本以進行輸出。 所以不要指望它是整潔的。
請參閱此Askubuntu 帖子
正如您所指出的,必須出現在 sudoers 配置中的文件是由sudo
啟動的文件,而不是運行sudo
。
話雖如此,我們經常做的事情是擁有類似的東西
user ALL=(ALL:ALL) NOPASSWD:/path/to/script.sh
在sudo
配置中, script.sh
包含腳本必須執行的所有命令。
然后我們定義一個 Bash 函數或一個別名,以便script.sh
實際上是
sudo /path/to/script.sh
唯一的問題是,如果某些命令不能以 root 身份運行,則需要在腳本中插入一些su - user -c "command"
命令。
我建議您查看 sudo 環境變量 - 特別是您可以使用(並檢查)$SUDO_USER。 使用 sudo(sudoers 中的 1 個條目)調用您的腳本,然后以 SUDO_USER 身份執行用戶內容,以 root 身份執行 root 內容。
在新的 /etc/sudoers.d/apt-get 文件中,放置一行:
user ALL=(ALL:ALL) NOPASSWD:/usr/bin/apt-get update
此處需要可執行文件的完全限定路徑。
然后在您的腳本中使用以下內容:
sudo apt-get update
在這里,不需要完全指定的名稱。 Sudo 使用 PATH 環境變量進行可執行文件解析。
在更改和檢查 sudoers 配置時,一定要保持另一個 root 會話打開以進行錯誤恢復。
簡單地說,為了以 root 身份執行命令,你必須使用 su(即使 sudo 使用 su)只要你成功執行 sudo ./script2.sh 就可以了: sudo su "#" //commands as root here "#" exit / /commands as used here you can make it a shell function with name sudo,但我認為沒有其他更好的方法,但是腳本inti,rc android ..etc的情況必須整潔;)
但是,這需要您輸入 NOPASSWD: su 確實是完全安全的
這里的任何方式都缺少 POISX 權限原則,即過濾,因此不要簡單地為所有用戶啟用某些功能,反之亦然,只需根據需要調用 sudo 即可,無需其他任何操作:
chown root script.sh
chmod 0755 script.sh
chgrp sudo script.sh
“使 .sh 的根所有者”“使其只讀並為其他人執行”“並將其放入 sudo 組”當然在 sudo 下就是這樣
正如 Basilevs 所提到的,您需要將您的用戶添加到sudoers
文件中,以避免腳本中的sudo
命令在等待密碼時卡住。
在 Ubuntu 16 上,有一種更簡單的方法:只需將用戶添加到sudo group
,如下所示:
sudo usermod -aG sudo *username*
從那時起,它應該像魅力一樣發揮作用。
筆記:
這僅適用於以下行在文件/etc/sudoers
:
%sudo ALL=NOPASSWD: ALL
(該行在組級別授予無密碼 sudo 權限,在本例中為sudo
組)
(如果此行不存在並且您想添加它,請確保使用visudo
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.