簡體   English   中英

從python腳本中進行SSH並運行必須提供sudo密碼的sudo命令

[英]SSHing from within a python script and run a sudo command having to give sudo password

我正在嘗試從python腳本中SSH到另一台主機中,並運行需要sudo的命令。

我能夠從python腳本中進行ssh,如下所示:

import subprocess
import sys
import json

HOST="hostname"
# Ports are handled in ~/.ssh/config since we use OpenSSH
COMMAND="sudo command"

ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],
                       shell=False,
                       stdout=subprocess.PIPE,
                       stderr=subprocess.PIPE)
result = ssh.stdout.readlines()
if result == []:
    error = ssh.stderr.readlines()
    print(error)
else:
    print(result)

但是我想在sshing之后運行這樣的命令:

extract_response = subprocess.check_output(['sudo -u username internal_cmd',
                                          '-m', 'POST',
                                          '-u', 'jobRun/-/%s/%s' % (job_id, dataset_date)])

        return json.loads(extract_response.decode('utf-8'))[0]['id']

我怎么做?

另外,我不想每次運行此sudo命令時都提供sudo密碼,因為我已經在要嘗試ssh的新主機的visudo末尾添加了此命令(即,來自上面的internal_cmd)成。 但是仍然在直接在終端中像這樣直接輸入以下命令時:

ssh -t hostname sudo -u username internal_cmd -m POST -u/-/1234/2019-01-03

系統提示我輸入密碼。 為什么會這樣呢?

您可以使用-S標志來傳遞密碼,該標志告訴sudo從標准輸入中讀取密碼。

echo 'password' | sudo -S [command]

您可能需要嘗試使用ssh命令的方式,但這應該可以滿足您的需求。

警告:您可能已經知道這一點...但是永遠不要將密碼直接存儲在代碼中,尤其是當您計划將代碼推送到類似Github的東西時。 如果您不知道這一點,請考慮使用環境變量或將密碼存儲在單獨的文件中。

如果您不想擔心將sudo密碼存儲在何處,則可以考慮將腳本用戶添加到sudoers列表中,並且僅對要運行的命令進行sudo訪問,並且不需要密碼選項。 請參見sudoers(5)手冊頁。

您可以通過在authorized_keys條目的開頭添加“ command”選項來進一步限制命令訪問。 請參見sshd(8)手冊頁。

如果可以,請禁用ssh密碼身份驗證以僅要求ssh密鑰身份驗證。 請參見sshd_config(5)手冊頁。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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