我需要在远程服务器上的某个文件上运行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命令,那么首选。
谢谢!
答案 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和其他系统。