zoukankan      html  css  js  c++  java
  • shell (check return of each line)(PIPESTATUS[@])and sudoer

    shell result from cmdline

    echo $?

    if 0 then success ;else failure

    (shell 执行每部返回值,rm -rf 错误,打包不能覆盖)

    我们知道,linux命令行上一个命令的退出码放在了$?环境变变中,但是,如果这个命令是一串管道符连接和多个命令,怎么知道每个命令的退出码?你可以 使用 PIPESTATUS环境变量。比如这个测试:true | false | true; echo "${PIPESTATUS[@]}"



    解决sudo: sorry, you must have a tty to run sudo
     
    前几天遇到一个问题,在一个终端中调用另一个shell,始终是无法执行的,后来捕捉到报错信息为sudo: sorry, you must have a tty to run sudo,后来,在网上了解到可以如下解决:
    1. 编辑 /etc/sudoers
     
      1)Defaults    requiretty,修改为 #Defaults    requiretty,表示不需要控制终端。
     
      2)Defaults    requiretty,修改为 Defaults:nobody !requiretty,表示仅 nobody 用户不需要控制终端。
     
           如果修改为 Defaults:%nobody !requiretty,表示仅 nobody 组不需要控制终端。
     
    其实只要注释掉)Defaults    requiretty 那个就可以了。表示在执行的时候不打开终端。但是,有的shell必须要有终端才可以执行。这样显然是不行的。后来,又找到一片文章才搞定。下面为抄录的,仅为记录以后使用。
     
    有些程序/脚本可能在没有控制终端的环境下上执行(如系统启动服务时, Daemon,
    或者是setsid启动的程序等) 但可能这个程序需要控制终端, 这这么办呢?
    如我们的例子: 我们在linux启动时启动一个服务, 可是中间有个程序(旧的systemtap)使用了sudo
    但sudo需要控制终端(当然可以通过修改sudo的配置文件, 但这样很对用户不友好啊)
    例子: (setsid 启动的程序会失去控制终端)
    # setsid sudo ls
    sudo: sorry, you must have a tty to run sudo
    (如果你的系统没有输出这句话, 那就是你的系统的sudo配置文件允许sudo可以在这个,
    请确保已经设置了Defaults    requiretty)
    没有控制中断的时候, 打开控制终端是这样的效果:
    # setsid head -c 0 /dev/tty
    head: cannot open `/dev/tty' for reading: No such device or address
    为了解决这个问题, 所以应该使用能创建(伪)控制终端的程序来启动你的程序如: script, expect
    如:
    # setsid script -c "sudo ls" /dev/null
    或:
    # setsid expect -c 'spawn sudo ls; expect'
    #打开控制终端成功:
    # setsid script -c 'head -c 0 /dev/tty' /dev/null 
    # setsid expect -c 'spawn head -c 0 /dev/tty; expect'
    不过 setsid 跟 script 组合使用有着奇怪的bug, 我这段时间非常的depression,
    这样对script, expect来说, 都是大材小用了
  • 相关阅读:
    设计模式系列
    Python3 系列之 可变参数和关键字参数
    设计模式系列
    【HANA系列】SAP HANA ODBC error due to mismatch of version
    【FICO系列】SAP FICO FS00修改科目为未清项目管理
    【FIORI系列】SAP OpenUI5 (SAPUI5) js框架简单介绍
    【HANA系列】SAP HANA SQL获取当前日期加若干天后的日期
    【HANA系列】SAP HANA SQL获取本周的周一
    【HANA系列】SAP HANA SQL获取当前日期
    【HANA系列】SAP HANA SQL获取当前日期最后一天
  • 原文地址:https://www.cnblogs.com/SZLLQ2000/p/6210823.html
Copyright © 2011-2022 走看看