【问题标题】:Python subprocess: how to send a password (rclone configuration)Python子进程:如何发送密码(rclone配置)
【发布时间】:2018-09-10 07:38:05
【问题描述】:

我想在 python 中使用rlcone。 如果我不使用密码加密我的 rclone 配置,那么我可以简单地这样做:

import subprocess 
process = subprocess.Popen(["rclone", "listremotes"], shell=True, stdin=subprocess.PIPE)
output = process.communicate()
print(output)

但我想用密码保护我的 Rclone 配置,所以我需要一种方法将其发送到 rclone。我关注了这个answer,但我收到了错误Failed to read password: The handle is invalid

import subprocess 
psw= input("enter psw")
psw_byte= str.encode(psw+'\n')
process = subprocess.Popen(["rclone", "listremotes"], shell=True, stdin=subprocess.PIPE,stdout=subprocess.PIPE, stderr=subprocess.PIPE)
process.stdin.write(psw_byte)
process.stdin.flush()
output = process.communicate()
print(output)

【问题讨论】:

  • 顺便说一句,shell=True 在这里是多余的。您既不需要也不想要 shell 来运行单个命令。
  • 看来rclone 没有从标准输入中读取其密码。许多程序强制读取/dev/tty 或类似的内容。运行脚本时可能有不同的方式来传递密码。
  • 看文档,或许可以在调用子进程的时候用密码设置环境变量RCLONE_CONFIG_PASS

标签: python subprocess


【解决方案1】:

我建议使用

rclone obscure 'thepass'

并查看或使用 config 文件

rclone config file

插入它而不是 pass 或者可以通过使用new conf file

   rclone ... --config=

【讨论】:

    【解决方案2】:

    这可能无法完全解决问题,但是,因为我在其他地方没有以这种形式找到这个问题,所以这是在 ipython 和/或 jupyter ipynb 中使用的解决方案。

    可以适应遇到的问题:

    import getpass
    rc_passwd = getpass.getpass()
    
    ! rclone --password-command "echo {rc_passwd}" lsd rc_remote:rc_path
    

    因为rc_pathrc_remote 中的路径

    【讨论】:

      【解决方案3】:

      我建议您使用RCLONE_CONFIG_PASS 环境变量将配置密码传递给rclone。请参阅section in the docs about configuration encryption

      例如

      os.environ("RCLONE_CONFIG_PASS") = "mypassword"
      

      读取密码的 Unix 程序往往不能像这样编写脚本,除非您指定一个 tty。

      虽然这很麻烦,所以我建议只设置环境变量。

      PS 如果你只想为子进程设置环境,你可以这样做:Python subprocess/Popen with a modified environment

      PPS 我是 rclone 的作者 :-)

      【讨论】:

      • 显然使用修改后的环境不是传递密码的安全方法:stackoverflow.com/questions/53232728。由于 rclone 不会从标准输入中读取其密码,有没有一种安全的方法可以通过 python 将密码传递给 rlcone?
      【解决方案4】:

      一种解决方法是使用subprocess.call() 并调用一个.cmd 来存储cmd 命令:

      在python中:

      import subprocess
      cmd_path = "C:\Users\user\Desktop\rclone_command.cmd"
      subprocess.call([cmd_path]) 
      

      inrclone_command.cmd(rclone完成同步后,可以启动另一个python脚本cfstartex解析日志):

      rclone sync  "C:\my path" "remote":"folder" --log-file "C:\Users\user\Desktop\log.log"  --log-level INFO --delete-after   --exclude "desktop.ini" 
      
      start "" "C:\Users\user\Desktop\some other script.py"
      

      【讨论】:

        猜你喜欢
        • 2020-01-10
        • 1970-01-01
        • 2020-04-21
        • 2011-01-24
        • 2013-01-09
        • 2011-09-01
        • 2018-04-27
        • 2015-03-12
        • 2021-05-15
        相关资源
        最近更新 更多