繁体   English   中英

重命名可执行文件失败

[英]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直接启动的外壳程序,而不是由外壳程序启动的另一个外壳程序。
  • 当我们确实将参数化的值(在本例中为文件名)替换为由外壳运行的脚本时,我们在Python 3中使用shlex.quote()或在Python 2中使用shlex.quote() pipes.quote()进行转义。
  • 当我们通过命令行传递shell脚本时,请确保它是正确的语法-这意味着,在这种情况下, if块需要以fi结尾。 http://shellcheck.net/是进行此类验证的有用资源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM