如何使用sudo启动Python Paramiko SFTP?

4
使用标准的client.open_sftp()句柄可以提供SFTP控件,但没有sudo/root权限,任何/etc/**文件都无法编辑。我有一个具有无密码sudo访问权限的用户,我想也许可以从sudo su开始,然后调用SFTP,但事实并非如此。
t = paramiko.Transport(('192.168.56.102', 22))  
t.connect(username='vagrant', password='vagrant')
chan = t.open_session()
chan.get_pty()
chan.invoke_subsystem('sftp')
chan.exec_command('sudo su')
sftp = paramiko.SFTPClient.from_transport(t)

.. 错误

paramiko.ssh_exception.SSHException: 通道已关闭。
DEBUG:paramiko.transport:在传输线程中的文件末尾

有什么提示可以让Paramiko以sudo访问打开SFTP?

1个回答

0

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

正确的解决方案是设置一个专用的私钥,仅包含您任务所需的特权。


invoke_subsystemexec_command 通常是互斥的。您可以使用其中之一,但不能同时使用两者。 "subsystem" 是一种对 "command" 的别名。例如,"sftp" subsystem 通常是 "/bin/sftp-server" 命令的别名(尽管这是一个非常简化的解释)。


没有原生支持以不同用户身份执行SFTP子系统。

因此,您所能做的就是直接以不同用户身份执行sftp_server二进制文件。

chan.exec_command('sudo su -c /bin/sftp-server')

(假设*nix OpenSSH服务器)
而且你绝对不能请求PTY(get_pty),因为那与SFTP协议不兼容。

我尝试了这个,但它没有起作用。如果你的OpenSSH sshd_config配置文件中有“子系统sftp <path to sftp_server>”,那么运行这个操作对底层用户没有任何影响。 - Parth Shah
我的回答与“Subsystem”指令无关,实际上是绕过了它。所以我不明白你的评论。 - Martin Prikryl
我尝试了您提出的解决方案,但一直收到权限被拒绝的错误。当我在我的机器上执行grep -e "sftp"时,我发现sftp_server没有运行。据我所知,当进行sftp连接时,OpenSSH会启动sftp_server进程。在这种情况下,您在此处提出的解决方案不起作用。 - Parth Shah
你所说的“我的机器”是指服务器还是客户端?“权限被拒绝错误”是什么意思?你所说的“这种情况”是指什么?我认为你应该发起一个新的问题,因为在评论中提供的信息很少,很难解决这个问题。 - Martin Prikryl
我的问题与此问题非常相似,但我添加了额外的内容:https://stackoverflow.com/questions/50035927/running-an-operation-as-a-different-user-via-python-paramiko-sftp - Parth Shah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接