簡體   English   中英

在腳本中使用沒有密碼的 sudo

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM