ags*_*ags 3 python unix sftp command
我们如何通过使用os.system在python脚本中调用unix shell命令将文件从源主机ftp发送到python中的目标服务器...请帮助
I have tried the following code
dstfilename="hi.txt"
host="abc.com"
user="sa"
os.system("echo cd /tmp >sample.txt)
os.system("echo put %(dstfilename)s" %locals()) // line 2
os.system("echo bye >>sample.txt")
os.system("sftp -B /var/tmp/sample.txt %(user)s@%(host)s)
How to append this result of line to sample.txt?
os.system("echo put %(dstfilename)s %locals()) >>sample.txt" // Seems this is syntatically not correct.
cat>sample.txt //should look like this
cd /tmp
put /var/tmp/hi.txt
bye
Any help?
Thanks you
Run Code Online (Sandbox Code Playgroud)
您应该将命令传递到中sftp。尝试这样的事情:
import os
import subprocess
dstfilename="/var/tmp/hi.txt"
samplefilename="/var/tmp/sample.txt"
target="sa@abc.com"
sp = subprocess.Popen(['sftp', target], shell=False, stdin=subprocess.PIPE)
sp.stdin.write("cd /tmp\n")
sp.stdin.write("put %s\n" % dstfilename)
sp.stdin.write("bye\n")
[ do other stuff ]
sp.stdin.write("put %s\n" % otherfilename)
[ and finally ]
sp.stdin.write("bye\n")
sp.stdin.close()
Run Code Online (Sandbox Code Playgroud)
但是,为了回答您的问题:
os.system("echo put %(dstfilename)s %locals()) >>sample.txt" // Seems this is syntatically not correct.
Run Code Online (Sandbox Code Playgroud)
当然不是。您想将字符串传递给os.system。所以它必须看起来像
os.system(<string expression>)
Run Code Online (Sandbox Code Playgroud)
以a )结尾。
字符串表达式由具有应用%格式的字符串文字组成:
"string literal" % locals()
Run Code Online (Sandbox Code Playgroud)
字符串文字包含shell的重定向:
"echo put %(dstfilename)s >>sample.txt"
Run Code Online (Sandbox Code Playgroud)
并在一起:
os.system("echo put %(dstfilename)s >>sample.txt" % locals())
Run Code Online (Sandbox Code Playgroud)
。但是正如我所说,这是我能想到的最糟糕的解决方案-更好地直接写入临时文件,甚至更好地通过管道直接进入子进程。