Python paramiko执行sudo

4

我正在使用paramiko的put方法将本地文件发送到远程服务器。 然而,我在执行sudo su - user命令查看远程文件时遇到问题。我也尝试从本地更改权限,但传输后文件权限仍保持不变。

import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect(<Host>, username=<User Name>, password=<Password)

sftp = ssh.open_sftp()
sftp.put(<Source>, <Destination>)
sftp.close()

有没有一种使用paramiko执行sudo su - user命令的方法,以便可以从远程读取传输的文件?
谢谢!

ssh.exec_command(command) 是执行命令的方式。 - Rajarshi Das
@RajarshiDas ... 是正确的,但是它在自己的 shell 中运行,因此对 open_ssh 的调用不会使用任何更改。 - Joran Beasley
1个回答

7

不,你不能这样做... 但你可以通过使用sudo在上传文件后移动文件来解决问题。

import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect(<Host>, username=<User Name>, password=<Password)

sftp = ssh.open_sftp()
sftp.put(<Source>, destination_i_CAN_write_to)
sftp.close()

#now move the file to the sudo required area!
stdin, stdout, stderr = ssh.exec_command("sudo -S -p '' mv /uploaded/path/to/file.txt /restricted/sudo/path/file.txt",**kwargs)
stdin.write(SUDO_PASSWORD + "\n")
stdin.flush()

sudu命令中的-S标志告诉它从stdin中获取密码。

-p ''标志告诉sudo使用空字符串''作为密码提示符。

在调用open_ssh之前,在exec_command中简单地使用sudo su - username不可行的,因为每次对exec_command的调用都运行在自己的子shell中,所以更改不会传播回主会话。


非常感谢。您知道在使用paramiko时是否有一种改变权限并保留它的方法吗? - Young
你可以尝试更改系统权限以使用软链接到受保护的区域,或者直接授予当前登录用户相应的权限。但是请注意,这样做可能会对系统造成影响。 - Joran Beasley
我正在尝试使用相同的代码,但是我使用的是cp命令而不是mv命令。在我的情况下,这两个命令都无法正常工作,因为当我执行ssh.exec_command('ls -l destination_folder')时,我看不到文件被复制。我还尝试通过手动连接从ssh到远程服务器进行检查,但我仍然看不到文件被复制。可能的原因是什么?是否有提供密码的特定格式?目前,我将强密码作为字符串变量。 - pythonaddict
此外,当我在远程位置手动使用此命令时:sudo -S -p " " cp /sourcefile /destination_location",并在提示上提供密码时,我可以看到文件正在被复制。但是使用paramiko时,同样的方法对我不起作用。 - pythonaddict

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