我有一个在前台运行Apache服务的容器.我希望能够从另一个shell访问容器,以便在其中"查找"并检查文件.目前,如果我附加到容器,我只是看着Apache守护进程,无法运行任何命令.
是否可以将另一个tty附加到正在运行的容器上?可能,我可以利用Docker实际上只是环绕LXC容器这一事实?我试过sudo lxc-console -n [container-id] -t [1-4]
但似乎只有一个tty可用,那就是运行apache守护进程的tty.也许有一种方法可以在构建期间启用多个lxc控制台?
如果可能的话,我宁愿不使用openssh服务配置和构建容器.
我正在尝试使用makefile编译一些源代码.在makefile中有一堆需要运行的命令sudo
.
当我从终端编译源时,一切正常,并且在第一次sudo
运行命令等待密码时暂停make .输入密码后,进行简历并完成.
但我希望能够在NetBeans中编译源代码.所以,我开始了一个项目,并展示了netbeans在哪里可以找到源代码,但是当我编译项目时,它会给出错误:
sudo: no tty present and no askpass program specified
Run Code Online (Sandbox Code Playgroud)
它第一次命中sudo
命令.
我在互联网上查找了这个问题,我发现的所有解决方案都指向一件事:禁用此用户的密码.由于这里的用户是root用户.我不想那样做.
还有其他解决方案吗?
我注意到有很多提到的pty
和tty
一些开源项目,可能有人能告诉我它们意味着什么以及它们之间有什么区别呢?谢谢!
这个选项到底是做什么的?我一直在读TTY,但我仍然感到困惑.我玩的没有-t
和只是-i
,似乎期望用户输入的程序抛出错误没有-t
.为什么启用伪TTY很重要?
我一直对使用print语句输出到终端需要多长时间感到惊讶/沮丧.在最近的一些令人痛苦的缓慢记录之后,我决定调查它并且非常惊讶地发现几乎所有花费的时间都在等待终端处理结果.
能以某种方式加速写入stdout吗?
我写了一个脚本(print_timer.py
在这个问题的底部),比较写入100k行到stdout,文件和stdout重定向到的时间/dev/null
.这是时间结果:
$ python print_timer.py
this is a test
this is a test
<snipped 99997 lines>
this is a test
-----
timing summary (100k lines each)
-----
print :11.950 s
write to file (+ fsync) : 0.122 s
print with stdout = /dev/null : 0.050 s
Run Code Online (Sandbox Code Playgroud)
哇.为了确保python不在幕后做某事,比如认识到我将stdout重新分配给/ dev/null或其他东西,我在脚本之外进行了重定向...
$ python print_timer.py > /dev/null
-----
timing summary (100k lines each)
-----
print : 0.053 s
write to file (+fsync) : 0.108 s
print with …
Run Code Online (Sandbox Code Playgroud) 每个串行设备显示两次/dev
,一次为a tty.*
,一次为a cu.*
.
什么是cu.*
设备?它与tty.*
设备有何不同?
mh@maru ~ --> ls -l /dev/*.usbmodem621
crw-rw-rw- 1 root wheel 11, 5 Dec 25 18:00 /dev/cu.usbmodem621
crw-rw-rw- 1 root wheel 11, 4 Dec 25 18:00 /dev/tty.usbmodem621
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用FTDI通过USB端口发送/接收数据,因此我需要使用C/C++处理串行通信.我正在使用Linux(Ubuntu).
基本上,我连接到正在侦听传入命令的设备.我需要发送这些命令并读取设备的响应.命令和响应都是ASCII字符.
使用GtkTerm一切正常,但是当我切换到C编程时,我遇到了问题.
这是我的代码:
#include <stdio.h> // standard input / output functions
#include <stdlib.h>
#include <string.h> // string function definitions
#include <unistd.h> // UNIX standard function definitions
#include <fcntl.h> // File control definitions
#include <errno.h> // Error number definitions
#include <termios.h> // POSIX terminal control definitions
/* Open File Descriptor */
int USB = open( "/dev/ttyUSB0", O_RDWR| O_NONBLOCK | O_NDELAY );
/* Error Handling */
if ( USB < 0 )
{
cout << …
Run Code Online (Sandbox Code Playgroud) 因此,您希望记录进程或子进程的stdout和stderr(单独),如果您没有记录任何内容,则输出与您在终端中看到的不同.
看起来很简单没有?不幸的是,看起来可能无法为这个问题编写一个通用的解决方案,这个解决方案适用于任何给定的流程......
管道重定向是一种分离stdout和stderr的方法,允许您单独记录它们.不幸的是,如果将stdout/err更改为管道,则进程可能会检测到管道不是tty(因为它没有宽度/高度,波特率等)并且可能会相应地更改其行为.为什么改变行为?好吧,一些开发人员利用终端的功能,如果您要写入文件,这些功能没有意义.例如,加载条通常要求将终端光标移回到行的开头,并使用新长度的条覆盖前一个加载条.颜色和字体粗细也可以显示在终端中,但是在平面ASCII文件中它们不能.如果您要将这样的程序的stdout直接写入文件,那么该输出将包含所有终端ANSI转义码,而不是正确格式化的输出.因此,开发人员在向stdout/err写入任何内容之前会执行某种"isatty"检查,因此如果该检查返回false,它可以为文件提供更简单的输出.
这里通常的解决方案是通过使用pty来欺骗这些程序,使管道实际上是ttys - 一个也具有宽度,高度等的双向管道.你将进程的所有输入/输出重定向到这个pty,这就是欺骗进程思考它与真实终端的对话(你可以直接将其记录到文件中).唯一的问题是,通过对stdout和stderr使用单个pty,我们现在无法再区分这两者.
所以你可能想为每个管道尝试不同的pty - 一个用于stdin,一个用于stdout,一个用于stderr.虽然这将在50%的时间内工作,但不幸的是,许多进程会执行额外的重定向检查,以确保stdout和stderr(/ dev/tty000x)的输出路径相同.如果它们不是,则必须有重定向,因此它们会给你相同的行为,就好像你没有pty管道stderr和stdout一样.
您可能认为这种过度检查重定向并不常见,但不幸的是它实际上非常普遍,因为许多程序重用其他代码进行检查,就像在OSX中找到的这些代码一样:
我认为找到解决方案的最佳方式是挑战.如果任何人都可以运行以下脚本(理想情况下通过Python,但此时我将采取任何措施),以便单独记录stdout和stderr,并且你设法欺骗它认为它是通过tty执行的,你解决了问题:)
#!/usr/bin/python
import os
import sys
if sys.stdout.isatty() and sys.stderr.isatty() and os.ttyname(sys.stdout.fileno()) == os.ttyname(sys.stderr.fileno()):
sys.stdout.write("This is a")
sys.stderr.write("real tty :)")
else:
sys.stdout.write("You cant fool me!")
sys.stdout.flush()
sys.stderr.flush()
Run Code Online (Sandbox Code Playgroud)
请注意,解决方案应该适用于任何进程,而不仅仅是此代码.覆盖sys/os模块并使用LD_PRELOAD是击败挑战的非常有趣的方法,但它们并没有解决问题的核心:)
当我运行PS时,其中一列输出是TTY.这是什么意思?特别是,作为"??"的价值如何 与"ttys000"比较?
我问,因为我有一个Java程序运行sort
通过的ProcessBuilder,而当这个程序是通过我的IDE(的IntelliJ)运行过程需要时为IDE外部可执行的JAR运行低于5倍.
在每种情况下,我都在运行排序时运行ps,唯一的区别是IDE创建了一个TTY为??的进程.而jar创建一个TTY为ttys000的进程.
我跑完之后
$ docker run --rm -v "/c/users/vipul rao/documents/github/wappalyzer:/opt/wappalyzer" -it wappalyzer/dev
我收到以下错误the input device is not a TTY. If you are using mintty, try prefixing the command with 'winpty'
我应该在这里使用我在MINGW64的Windows 8上运行.