[英]How to make python script to give sudo prompt my password
我正在用 python 3.6 編寫一個使用許多 sudo 命令的腳本。 該腳本以我的用戶身份在 linux 機器上運行。 該腳本正在創建一種報告,對許多服務器執行 ssh 並運行諸如 lsof 之類的命令。
我需要一種讓 python 每次使用 sudo 時都提供我的密碼的方法。 顯然在第一次我會輸入我的密碼,它可以保存在腳本的內存中。 我一直在使用 python 子進程來運行我的 sudo 命令,例如:
cmd = SSH + '-t ' + source + " ' " + SUDO + "-k " + LSOF + "-p " + pid + " ' " output = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True, universal_newlines=True)
(out,error) = output.communicate()
是否可以?
約束:
不允許使用根工具包
使用 sudo 運行腳本不是一種選擇,因為該腳本對許多服務器執行 ssh,並且出於安全原因,我不允許這樣做。
無法更改 sudoers 文件中的任何內容。
我建議你使用 Python 的 "pexpect" 模塊來做到這一點。 它基於“期望”並用於自動與其他程序進行交互。 請注意,它不是 python 標准庫的一部分,但如果您創建自己的 python 環境,則不一定需要 root 來安裝它。
例子:
#import the pexpect module
import pexpect
# here you issue the command with "sudo"
child = pexpect.spawn('sudo /usr/sbin/lsof')
# it will prompt something like: "[sudo] password for < generic_user >:"
# you "expect" to receive a string containing keyword "password"
child.expect('password')
# if it's found, send the password
child.sendline('S3crEt.P4Ss')
# read the output
print(child.read())
# the end
更多詳情可在這找到:
https://pexpect.readthedocs.io/en/stable/api/index.html
希望這可以幫助!
花了幾個小時來弄清楚如何使用子流程來做到這一點。
所以享受:
import getpass
import subprocess
sudo_password = getpass.getpass(prompt='sudo password: ')
p = subprocess.Popen(['sudo', '-S', 'ls'], stderr=subprocess.PIPE, stdout=subprocess.PIPE, stdin=subprocess.PIPE)
try:
out, err = p.communicate(input=(sudo_password+'\n').encode(),timeout=5)
except subprocess.TimeoutExpired:
p.kill()
以下答案執行了三種驗證訪問的嘗試:
root
sudo
sudo
對sudo
調用調用echo
命令並檢查應該由echo
打印的相同測試:單詞OK
。
import os, subprocess
from getpass import getpass
def is_root():
return os.geteuid() == 0
def test_sudo(pwd=""):
args = "sudo -S echo OK".split()
kwargs = dict(stdout=subprocess.PIPE,
encoding="ascii")
if pwd:
kwargs.update(input=pwd)
cmd = subprocess.run(args, **kwargs)
return ("OK" in cmd.stdout)
def prompt_sudo():
ok = is_root() or test_sudo()
if not ok:
pwd = getpass("password: ")
ok = test_sudo(pwd)
return ok
if prompt_sudo():
print("Access granted !")
else:
print("Access denied !")
因為你想給你的python腳本sudo
密碼,所以我認為最好創建一個新的用戶組並將這個組設置到你的腳本文件中。 您的腳本不再需要sudo
密碼(仍然有sudo
權限)。
注意:(我的答案在Ubuntu 14.04
上測試過。另一個 Linux 版本應該是一樣的。 )
如果您以 root 用戶身份登錄,則可以隨時通過鍵入以下內容來創建新用戶:
adduser <newuser>
或者
sudo adduser <newuser>
如果您的新用戶應該能夠以 root(管理)權限執行命令,您將需要授予新用戶對sudo
訪問權限。
我們可以通過使用visudo
命令來完成此操作,該命令會在您的編輯器中打開相應的配置文件。 這是進行這些更改的最安全方法。
visudo
或者
sudo visudo
搜索如下所示的行:
root ALL=(ALL:ALL) ALL
在此行下方,復制您在此處看到的格式,僅更改單詞“root”以引用您希望為其授予sudo
權限的新用戶:
root ALL=(ALL:ALL) ALL
<newuser> ALL=(ALL) NOPASSWD:ALL
使用chown
更改 python 腳本的所有權。
sudo chown <newuser>: <python script>
之后,您可以在沒有密碼的情況下在sudo
權限下運行您的腳本。
注意:(我建議你這樣做,因為你想把你的sudo
密碼放到源代碼中。但是,請小心你的腳本。它有更強大的...... )
我認為你應該使用 Paramiko 庫來做到這一點。 確保在導入之前安裝 paramiko。 檢查這個
下面是一個示例代碼。 使用前先測試一下。
$pip install paramiko
import paramiko
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
pid = 12345 # Modify this per your requirement
try:
ssh_client.connect('source',username='user',password='pwd')
stdin,stdout,stderr = ssh_client.exec_command('sudo -k lsof -p '+pid)
stdin.write('pwd\n')
stdin.flush()
result = stdout.read.splitlines()
except paramiko.SSHException:
print('Connection Failed')
quit()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.