【问题标题】:Python paramiko executing sudoPython paramiko 执行 sudo
【发布时间】:2017-09-18 17:53:35
【问题描述】:

我正在使用 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()

有没有办法使用 paramkio 执行sudo su - user 命令,以便远程读取传输的文件?

谢谢!

【问题讨论】:

  • ssh.exec_command(command) 是执行命令的方式
  • @RajarshiDas ... 正确,但是它在自己的 shell 中运行它,因此任何更改都不会被调用 open_ssh

标签: python linux paramiko


【解决方案1】:

不,你不能这样做......但是你可以通过使用 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 标志告诉它期望密码来自标准输入

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

不能在调用exec_command 之前仅在exec_command 中使用sudo su - username,因为对exec_command 的每次调用都在其自己的子shell 中运行,因此更改不会传播返回主会话

【讨论】:

  • 非常感谢。你知道在使用 paramiko 时是否有办法更改权限并保留它?
  • 没有...我猜您可能会弄乱您的系统权限以使用软链接进入受保护区域,或者只是向您登录的用户授予权限
  • 我正在尝试使用相同的代码,但我使用的是 cp 命令而不是 mv。就我而言,当我执行 ssh.exec_command('ls -l destination_folder) 时,这两个命令都不起作用,我没有看到文件被复制。我还尝试通过手动连接从 ssh 到远程服务器进行检查,但我仍然看不到正在复制的文件。可能是什么原因?是否有任何特定格式来提供密码?现在我将强密码作为字符串变量。
  • 另外,当我在远程位置手动使用此命令时:sudo -S -p " " cp /sourcefile /destination_location",当我在提示时提供密码时,我可以看到正在复制的文件。但是使用 paramiko 对我来说同样不起作用。