我正在服务器上运行脚本,并尝试从防火墙中获取一些文件。使用环境变量($
符号)引用文件时,出现“找不到文件”错误。 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”脚本。因此,$FWDIR
与exec_command
一起使用,但不适用于SFTP get
。
我在哪里做错了,我该怎么办?
答案 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()