我尝试在通过ssh执行其他命令之前测试用户的文件权限。我有:
ssh = paramiko.SSHClient()
channel = ssh.get_transport().open_session()
# Check permissions
channel.send("if [ -w %s ]; then echo \"true\"; else echo \"false\"; fi\n" % self.dest_path)
if (channel.recv(1024) == "false"):
exit(PRIV_ERR)
但是,我从来没有得到远程机器的响应。其他.recv()
来电可以很好地响应,所以我认为我的bash脚本存在问题?它在当地工作正常。当我尝试通过ssh频道接收时,我收到超时异常。
答案 0 :(得分:0)
小心发送路径和/或运行小脚本 - 很容易不正确引用内容。这将显示为程序在大多数情况下正确运行,但无法处理带有空格或撇号或Unicode字符的文件。
此代码运行" test -f(mypath)"远程,发信号通知mypath
是否为文件。考虑使用像Fabric这样的更复杂的库来做这种事情 - 它更可靠。 (Fabric链接)
import paramiko
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('localhost')
# Check permissions
# TODO: do proper quoting to handle filenames with apostrophes
_stdin,stdout,_stderr = client.exec_command(
"test -f '{}' && echo isfile".format('/etc/issue')
)
isfile = stdout.read().strip() == 'isfile'
print 'isfile:', isfile
isfile: True