【问题标题】:Running an SFTP operation as a different user via Python Paramiko通过 Python Paramiko 以不同用户身份运行 SFTP 操作
【发布时间】:2018-04-26 06:11:00
【问题描述】:

我想使用服务帐户连接到我的 Ubuntu 服务器,但代表另一个用户执行文件传输操作。我的sshd_config 有以下内容(除其他外):

PubKeyAuthentication yes
PasswordAuthentication yes
Subsystem sftp /usr/lib/openssh/sftp-server

我尝试了以下代码,但没有任何成功:

t = paramiko.Transport(('<address>', <port>))  
t.connect(username='serviceAccount', password='<password>')
channel = t.open_session()
channel.exec_command('sudo su -l <other user> -c /usr/lib/openssh/sftp-server')
sftp = t.open_sftp_client()
file = sftp.file("<some path>", "w", bufsize=...)
file.write(...)
file.close()
sftp.close()
channel.close()
t.close()

这是我在运行此代码时看到的错误:

IOError: [Errno 13] Permission denied

【问题讨论】:

    标签: python ssh sftp paramiko su


    【解决方案1】:

    首先,自动化susudo 不是正确的解决方案。

    正确的解决方法是直接用你需要使用的账号登录。


    无论如何,open_sftp_clientexec_command 在两个不同的 SSH 通道上运行。所以你的代码不能工作,因为sftp 在非提升会话上运行,这根本不受exec_command 的影响。

    没有明确支持在 Paramiko 中使用 su 运行 SFTP(因为这种方法是错误的并且几乎没有标准化)。

    您必须实现 SFTPClient.from_transport 的替代方案,该替代方案将调用您的 exec_command 而不是 invoke_subsystem

    【讨论】:

    • 所以我改成 sftp = SFTPClient.from_transport(t) 还是一样的错误。
    • 我在哪里写的你应该打电话给sftp = SFTPClient.from_transport(t)
    • 抱歉,我以为你是这么建议的。有哪些替代方案?我完全同意您直接使用我需要代表执行操作的帐户登录,但我的情况有点复杂,因为用户数量每天都在变化。
    • 我的建议在我回答的最后一句话中。
    • 没有直接的解决方案,因为 SFTP 没有任何 API 来切换用户。因此,任何允许您切换用户的解决方案都是 hack,需要进行调整。无论您使用什么语言/工具/库。 再次,不要切换用户,用你需要使用的用户登录。
    猜你喜欢
    • 2013-04-13
    • 2020-05-26
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多