在Paramiko的SFTP路径中使用环境变量

时间:2018-12-12 08:13:04

标签: python shell sftp paramiko

我正在服务器上运行脚本,并尝试从防火墙中获取一些文件。使用环境变量($符号)引用文件时,出现“找不到文件”错误。 B,但是当我输入正常路径时我可以获取文件。我知道代码看起来不太好,这只是一个简单的示例。这是我的工作代码:

_savedLocation = "/home/kartal/Desktop/aaa.tgz"
folder, savedLocation = os.path.split(_savedLocation)
remotepath = "$FWDIR/bin/upgrade_tools/"
remotefile = remotepath + savedLocation
stdin, stdout, stderr =
  ssh.exec_command("cd {} && yes | ./migrate export {} ".format(remotepath, savedLocation))
time.sleep(120)
command = "cd {} && chmod 777 {}".format(remotepath, savedLocation)
stdin, stdout, stderr = ssh.exec_command(command)
sftp = ssh.open_sftp()
sftp.get(remotefile, _savedLocation)
sftp.close()
ssh.close()

如果我将真实路径用作remotepath = "/opt/r80/fw1/bin/upgrade_tools/",则代码有效。

顺便说一句,我首先使用$FWDIR运行“ migrate”脚本。因此,$FWDIRexec_command一起使用,但不适用于SFTP get

我在哪里做错了,我该怎么办?

1 个答案:

答案 0 :(得分:0)

您不能在SFTP中使用环境变量。您必须使用真实路径。在这种情况下,实际路径为/opt/CPsuite-R80/fw1

如果真实路径不固定,并且您确实确实需要从变量值获取真实路径,则需要使用其他接口(例如,使用shell访问)解析变量值。然后在SFTP中使用解析的值。这就是您在WinSCP中所做的-在shell中执行cd $FWDIR。外壳将$FWDIR解析为/opt/CPsuite-R80/fw1。在Paramiko中,您可以使用SSHClient.exec_command来解析变量:

stdin, stdout, stderr = ssh.exec_command("echo $FWDIR")
fwdir = stdin.read()