簡體   English   中英

如何制作python腳本以提供sudo提示我的密碼

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

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