通过用户名而不是uid通过paramiko来表示

时间:2014-08-14 06:44:41

标签: python paramiko

我需要在远程服务器上的某个文件上运行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命令,那么首选。

谢谢!

2 个答案:

答案 0 :(得分:0)

  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

答案 1 :(得分:0)

对于任何希望这样做的人,这都是遥远的未来。您可以使用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和其他系统。