[英]Fail in renaming executable files
我在python中通过ssh执行命令。
os.system("ssh atl.LB99@172.31.54.76 'bash --login -c "if [[ -e filepath && ! -L filepath ]];then mv filepath filepath.backup; fi;"'")
我有使用此命令的文件路径列表。 此命令的目的是在原始文件名后面添加“ .backup”。 但是,这并不总是有效。 文件名结尾(它们是可执行文件。不是文件名的一部分,只是说这个文件是可执行文件),没有将其名称更改为“ filename.backup”。 这些文件确实具有足够的权限(例如,-rwxrwxr-x)。
系统是Linux,外壳是bash。
解决这个问题的关键是什么?
如果没有错误和附带的复杂性,它可能看起来像:
import subprocess
try:
from pipes import quote # Python 2.x
except ImportError:
from shlex import quote # Python 3.x
# does not need to be shell-quoted; path='/path/to/filename with spaces' is legal
path = "filepath"
cmd = '''
path=%(path)s
# this is all POSIX-compliant syntax below, so we don't need to rely on bash
if [ ! -L "$path" ] && [ -e "$path" ]; then
mv -- "${path}" "$path.backup"
fi
''' % {"path": quote(path)}
subprocess.Popen(['ssh', 'atl.LB99@172.31.54.76', cmd])
这里的重点是什么?
os.system()
或shell=True
参数subprocess.Popen()
没有当地壳。 因为我们不使用bash -c
,所以只有一个远程外壳程序-由ssh直接启动的外壳程序,而不是由该外壳程序启动的另一个外壳程序。 shlex.quote()
或在Python 2中使用shlex.quote()
pipes.quote()
进行转义。 if
块需要以fi
结尾。 http://shellcheck.net/是进行此类验证的有用资源。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.