【问题标题】:Why is 256 Returned When Calling A Bash Script Using Python [duplicate]为什么在使用 Python 调用 Bash 脚本时返回 256 [重复]
【发布时间】:2021-04-01 20:42:08
【问题描述】:

我有一个简单的 bash 脚本

check_repo() {
    if cat /etc/apt/sources.list | grep "deb https://http.kali.org/kali kali-rolling main contrib non-free" || cat /etc/apt/sources.list | grep "deb https://http.kali.org/kali kali-rolling main non-free contrib"
    then
        return 0
    else
        return 1
    fi
}

check_repo

这个脚本检查sources.list文件是否存在特定的repo,如果存在则返回0,如果不存在则返回1,但是当我使用python3通过check = os.system("bash myscript.sh")调用脚本但当我打印时变量“检查”它打印 256

为什么会给出这样的输出以及我该如何解决?

  • 操作系统:Kali Linux
  • 内核:x86_64 Linux 5.9.0-kali4-amd64
  • 外壳:bash 5.1.0

感谢您提前回答

【问题讨论】:

  • os.system() 的返回值不是进程的退出值。见docs.python.org/3/library/os.html#os.system
  • 如果你将 Kali 用于渗透测试以外的任何事情,那么你做错了。
  • @tripleee 嗯,我知道,但我想我不需要安装任何其他操作系统来编程?

标签: python python-3.x linux bash


【解决方案1】:

在 Unix 上,waitstatus_to_exitcode() 可用于将结果(退出状态)转换为退出代码。在 Windows 上,结果直接是退出代码。 这里: https://docs.python.org/3/library/os.html#os.system

【讨论】:

    【解决方案2】:

    这是os.system() 返回的;在类 Unix 系统上,高 8 位是结果代码,低 8 位是信号(如果没有信号,则为 0)。

    在 Python 中执行此操作的正确方法是

    check = False
    with open("/etc/apt/sources.list") as repo:
        for line in repo:
            if "deb https://http.kali.org/kali kali-rolling main contrib non-free" \
                in line or "deb https://http.kali.org/kali kali-rolling main non-free contrib" \
                    in line:
               check = True
               break
    

    在 shell 脚本中执行此操作的正确方法是

    if grep -q -e "deb https://http\.kali\.org/kali kali-rolling main contrib non-free" -e "deb https://http\.kali\.org/kali kali-rolling main non-free contrib" /etc/apt/sources.list
    then ...
    

    (或重构以使用带有单个正则表达式的grep -E 来覆盖这两个表达式;请参阅下面的尝试)。

    如果你想把它放在一个函数中,grep 的退出状态将是 0 或 1,所以不需要单独 return 之外的任何东西。

    从 Python 脚本调用它的正确方法是

    import subprocess
    
    check = subprocess.check_call(['grep', '-q', '-E',
            r'deb https://http\.kali\.org/kali kali-rolling main( contrib| non-free){2}',
            '/etc/apt/sources.list'])
    

    【讨论】:

    • 代码仍然存在问题,它还应该检查/etc/apt/sources.d/*.list 中的所有文件,但忽略任何被注释掉的行。它还应该允许空格的变化。对这种格式使用简单的解析器比单独尝试解决这些错误中的每一个要好;理想情况下,找到正确提供此功能的库。
    猜你喜欢
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 2019-10-31
    • 2012-06-08
    • 2011-04-13
    • 2020-09-15
    相关资源
    最近更新 更多