Solve sudo: sorry, you must have a tty to run sudo a few days ago encountered a problem, calling another shell in one terminal is always unable to execute, and then caught the error message sudo: sorry, you must have a tty to run sudo. Later, I learned on the Internet that the solution is as follows: 1. edit/etc/sudoers 1) Defaults requiretty and change it to # Defaults requiretty, indicating that the terminal does not need to be controlled. 2) Defaults requiretty, changed to Defaults: nobody! Requiretty, indicating that only the nobody user does not need to control the terminal. If it is changed to Defaults: % nobody! Requiretty, indicating that only the nobody group does not need to control the terminal. In fact, you only need to comment out) Defaults requiretty. Indicates that the terminal is not opened during execution. However, some shells must have terminals before execution. This is obviously not acceptable. Later, I found another article. The following is a copy, which is used only after record. Some programs/scripts may be executed in environments without control terminals (such as Daemon or setsid-enabled programs when the system starts services), but this program may need to be controlled by terminals, how can this be done? For example, we started a service in linux, but there was a program (old systemtap) in the middle) sudo is used, but sudo needs to control the terminal (of course, you can modify the sudo configuration file, but this is not user-friendly) Example: (the program started by setsid will lose the control Terminal) # setsid sudo lssudo: sorry, you must have a tty to run sudo (if your system does not output this sentence, that is, The sudo configuration file of your system allows sudo to be in this, please make sure that Defaults requiretty has been set) when there is no control interruption, open the control terminal is like this: # setsid head-c 0/dev/ttyhead: cannot open '/dev/tty' for reading: No such device or address to solve this problem, you should use the ability to create (pseudo) control the terminal program to start your program such as: script, keep CT such as: # setsid script-c "sudo ls"/dev/null or: # setsid login CT-c 'spawn sudo ls; login ct' # Open the control terminal successfully: # setsid script-c 'head-c 0/dev/tty '/dev/null # setsid expect CT-C' spawn head-c 0/dev/tty; except CT ', there is a strange bug in the combination of setsid and script. During this time, I was very depression, so it was quite useless for scripts and reverse CT.