簡體   English   中英

將os.system()轉換為subprocess.call()

[英]Converting an os.system() to subprocess.call()

當這些參數包含組合的變量字符串時,我對subprocess.call命令參數的語法有些不確定

我在使用os.system成功運行的單個完整命令字符串中使用了4個變量:

  • userPWD
  • 用戶名
  • 主機名
  • 路徑

    os.system(“ sshpass -p%s scp%s @%s:/var/tmp/*Metrics.csv%s”%(userPWD,userName,hostName,path))

現在將其轉換為subprocess.call,它將為我提供所需的輸出狀態,此命令字符串某些方面的格式使我感到迷惑,因為subprocess.call文檔通常僅顯示如下非常簡單的命令:

subprocess.call(['ls', '-l'])

我首先進行的轉換如下所示:

subprocess.call(["sshpass", "-p", userPWD, "scp", "userName@hostName:/var/tmp/*Metrics.csv", path"])

但這會在Python 2.7.3中產生以下錯誤消息:

Traceback (most recent call last):
  File "pyprobeConnect.py", line 73, in <module>
    get_csvPassFail = subprocess.Popen("sshpass -p %s scp %s@%s:/var/tmp/*Metrics.csv %s" % (userPWD, userName, hostName, path)).read()
  File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

當包含*您需要傳遞shell=True ;如果要傳遞shell=True ,則需要將第一個參數指定為字符串而不是列表。

subprocess.call("sshpass -p %s scp %s@%s:/var/tmp/*Metrics.csv %s" % (userPWD, userName, hostName, path),shell=True)

通常,我認為在subprocess系列中使用shell=True並不是一個好主意。 這是一種非常眾所周知的攻擊(或帶來不便)的媒介。 惡意(或無知)用戶可以注入任意shell命令。 在您的情況下,密碼字段似乎由用戶控制,因此可能存在風險。 拒絕使用os.system的原因是為了防止這種錯誤。

在這里,我假設您正在使用scp將文件從遠程拉到本地主機。 在那種情況下,shell *無關緊要,因為它是由遠程shell擴展的。

您的堆棧跟蹤信息表明問題是在您的情況下sshpass可執行文件。 這可能是因為包含可執行文件的目錄不在您的PATH環境變量中。

要解決此問題,您可以在以下偽造的Python中簡單地在調用命令時臨時修改PATH (您需要填寫自己的詳細信息):

import os
cur_path = os.environ["PATH"]
if dir_of_your_executable not in cur_path:
    cmd_path = "%s:%s" % (dir_of_your_executable, cur_path)
else:
    cmd_path = cur_path
cmd_env = os.environ.copy().update(PATH=cmd_path)
subprocess.call(["sshpass", "rest", "of", "your", "command"], env=cmd_env)

該代碼將首先檢查sshpass的目錄是否在PATH 如果不是,則將其前綴為PATH並用於命令執行。

或者,只需使用絕對路徑:

subprocess.call(["/path/to/sshpass", "rest", "of", "your", "command"])

最后,要提一個警告:對sshpass 這是不安全的,因此是邪惡的。 在執行自動命令之前,通過啟動ssh-agent使用基於公鑰的SSH身份驗證。 免除密碼,尤其是sshpass -p傳遞的密碼。 他們是邪惡的。 拒絕吧。

暫無
暫無

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

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