【问题标题】:chown via paramiko by username and not uid通过用户名而不是 uid 通过 paramiko chown
【发布时间】:2014-08-14 06:44:40
【问题描述】:

我需要在远程服务器上的某个文件上运行 chown 来更改所有者(而不是组)。 paramiko chown 命令接受 3 个参数:path、gid、uid。

在我的代码中,我有用户名,而不是 uid。所以这是我的代码:

#some code here
...
object_stat = sftp_client.stat(object_path)
sftp_client.chown(object_path, owner_username, int(object_stat.st_gid))
...
#more code

有没有办法解决这个问题?如果我们可以避免使用 shell 命令,它是首选。

谢谢!

【问题讨论】:

  • 你可以使用pexpect然后直接运行chown命令。它想在你自己的系统上运行cmd。
  • @vks - 谢谢。可以期待“骑” paramiko 连接吗?还是我必须打开一个新连接?
  • 不,它自己建立连接。
  • 您可以通过pwd模块从用户名中获取uid,从uid中获取用户名。 docs.python.org/2/library/pwd.html

标签: python paramiko


【解决方案1】:
  import pexpect
  new_child=pexpect.spawn("ssh ....")
  new_child.expect("Password:")
  new_child.sendline(mypass)
  new_child.expect("$")#or whatever the bash symbol is 
  new_child.sendline("chown. ...")
  new_chile.expect("$")

如果你想输出使用 new_child.before

【解决方案2】:

这是一个来自遥远未来的答案,任何人都在寻找这个。您可以使用 SFTP 客户端发送任意 SSH 命令,即,

def sendCommand(sftp, *command, **kwargs):
  cmd = " ".join([str(c) for c in command])

  session = sftp.sock.get_transport().open_channel(kind = "session")

  try:
    session.exec_command(cmd)

    stdout = bytearray()
    stderr = bytearray()
    rc = 0 

    while True:
      if session.exit_status_ready():
        while True:
          data = session.recv(8192)
          if not data:
            break
          stdout.extend(data)
        while True:
          data = session.recv_stderr(8192)
          if not data:
            break
          stderr.extend(data)
        break

    rc = session.recv_exit_status()

    if rc != 0 and not kwargs.get("ignore_errors", False):
      raise ValueError("Command {0} failed with exit code {1}.\n{2}".format(" ".join(command), rc, stderr))
    else:
      try:
        return stdout.decode("UTF-8")
      except UnicodeDecodeError:
        return stdout
  finally:
    session.close()

然后,使用它,我们可以使用通道运行getent。当针对passwd 数据库运行时,您将得到类似root:x:0:0:root:/root:/bin/bash 的内容。索引 2 是用户的 UID,索引 3 是用户的 GID(注意 - 不是任意组名的 GID)。

uid = sendCommand(client, "getent", "passwd", username).split(":")[2]

对于组,执行相同操作,但使用 group 数据库。

gid = sendCommand(client, "getent", "group", group).split(":")[2]

getent 也可以传递一个 UID 或 GID,这将使您可以反向查找。注意我说的是 POSIX 主机,YMMV 和其他系统。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    相关资源
    最近更新 更多