我正在远程 ssh 主机上执行脚本,如下所示:
ssh -tt $USER@somehost 'bash -s' < ./myscript.sh
注意伪 tty-tt开关。
我的问题是脚本运行完毕后,ssh 会话并未结束。打字exit也没有任何作用。我如何让它退出?
有人可以向我解释一下为什么会发生这种情况吗?
# su - someone -s /bin/bash -c "ls -la /dev/tty"
crw-rw-rw- 1 nobody nogroup 5, 0 Dec 7 20:53 /dev/tty
# BUT:
# su - someone -s /bin/bash -c "echo hello > /dev/tty"
-su: /dev/tty: No such device or address
Run Code Online (Sandbox Code Playgroud)
我正在尝试构建一个 docker 容器,其中包含两个服务。这些服务由 Shell 脚本启动:
CMD ["./starter.sh"]
Run Code Online (Sandbox Code Playgroud)
使用Dockerfile我已将日志重定向到/dev/stderr或/dev/tty
# None of the following works:
RUN ln -sf /dev/tty /var/log/thelog.log
RUN ln -sf /dev/stdout /var/log/thelog.log
RUN ln -sf /dev/stderr /var/log/thelog.log
Run Code Online (Sandbox Code Playgroud)
问题是我试图以非 root ( su - …
我们知道,当 ssh 连接断开时,bash 将收到 SIGHUP 信号,并将此信号转发给其所有子节点。
我想知道这个SIGHUP的原始发送者是谁,是ssh客户端、ssh服务器、操作系统还是其他?
我阅读了openssh-portabal的代码,发现只有这里使用了SIGHUP: https: //github.com/openssh/openssh-portable/blob/master/sshconnect.c#L285
调用者似乎是客户端: https://github.com/openssh/openssh-portable/blob/master/ssh.c#L1533
我在服务器端 sshd.c 中没有找到任何发送者代码
这是否意味着发件人是客户端?在这种情况下,如果连接中断,服务器将不会收到 SIGHUP。我对此不太确定,但根据我的经验,这似乎不是真的。
所以我很好奇谁应该是原始发件人。这有标准吗?
我对Java和Android知之甚少。我想做的是在 Android 应用程序中打开 /dev/ttyS0,它应该与串行线通信,但我迷路了。
我的设备已root,并且从命令行我可以“echo ...>/dev/ttyS0”并从中读取内容,但我在尝试用Java执行此操作时迷失了方向。首先,我找不到一种方法以简单的读写模式打开文件,而不需要处理缓冲区和其他复杂的问题(显然,我想要无缓冲的 I/O)。
我在互联网上搜索,但所有示例都指的是 USB,这对我来说不可用。然后我找到了 UartDevice 类,但它是一个从中派生正确实现的类......
我尝试使用 File 类,并附加一个 Reader 和 Writer 类,但编译器抱怨,坦率地说,我不确定这是正确的方法。我需要一个框架代码来开始;我怀念一个简单的 TextFile 类,它具有可在同一个打开文件上同时使用的无缓冲 read() 和 write() 方法!
有人能指出我正确的方向吗?谢谢?
我有一个在Linux上以root身份运行的程序,与tty交谈(实际上是一个实现为tty的LCD).值得的设备是/ dev/ttyUSB0.我想让我写入该设备的程序能够独占访问该设备,以免受到同时运行的其他程序实例的干扰.
我看到有一个名为TIOCEXCL的ioctl选项会阻止设备的额外打开,除非发出TIOCEXCL ioctl,否则对同一文件的多次open()调用将成功.这将阻止除root权限进程之外的其他打开. " 我对此进行了测试,它的工作方式与广告一样:如果非root用户尝试打开/ dev/ttyUSB0(一旦我更改了权限),那么打开失败,例如"设备忙",如果root用户尝试打开它, 有用.
理想情况下我想要的是这种独家访问tty以便为root用户工作的方法.所以我有多个root用户使用写入LCD的程序,但不知何故他们对LCD(tty)的访问将被序列化.显然,TIOCEXCL ioctl选项对我不起作用,因为它不会阻止root用户打开已经打开的tty设备.
我想这里有很多选择,但我会向所有人伸出援手,看看你是否还有其他想法或建议.
也许我错过了使用TIOCEXCL的一些东西......
也许还有其他方式通过open()或ioctl()或what-not获得独占访问权限.
如果有某种方法我可以检测到某个其他进程打开了设备,我可以等待并重试.我知道lsof,但我不愿意从这个程序中调用它只是为了学习这个.并且存在竞争条件.(也许我可以克服那个?:))
我可以实现锁定,就像显然用来获得对tty设备的独占访问.
更新1:
由于写入LCD设备的唯一程序是我的,我倾向于执行类似以下(伪代码)的操作来锁定代码:
f = open("/dev/ttyUSB0", O_RDWR)
flock(f, LOCK_EX)
// do any ioctl's, etc.
// do any write's
// sleep a tad to not flash messages too fast on LCD
nanosleep({0, 250000000}, NULL)
flock(f, LOCK_UN)
close(f)
Run Code Online (Sandbox Code Playgroud) 我在Ubuntu 12.04 LTS机器上使用Go 1.2进行编码 - 使用LiteIDE(非常满意).
我下载并安装了go termbox软件包 - 构建了demo keyboard.go - 很好.
但是当我从LiteIDE运行时,我得到了这种恐慌 - 所有的termbox演示也是如此:
panic: open /dev/tty: no such device or address
Run Code Online (Sandbox Code Playgroud)
任何线索都会有所帮助....
如果我在"Xorg/XFree86/XSystem/Mir/Wayland"会话中,我想知道如何检查任何Linux发行版.
如果是,我在Xsession运行命令,如果没有在cli模式下运行命令
我尝试了以下方法:
xtty=`w -hs | awk '{print $2}' | sort -u | sed 's/^[tty \t]*//' | sed -n '$p'` && echo "tty X(org/Free86/System) = $xtty"
Run Code Online (Sandbox Code Playgroud)
但这只是为了知道我在哪个.
在某些发行版中,图形模式位于tty1,tty5,tty6或tty7中.但是,我想知道我是否登录了那个tty,如果我在图形会话中.
有人可以帮我这个吗?
在我的登录屏幕上,我必须输入一个 32 个字符的疯狂密码,并且在我输入密码之前计时器就到期了。
我尝试搜索如何更改控制何时重置登录尝试的计时器。我很难找到解决方案,也许是因为我没有正确搜索。我找到了this,它描述了我正在搜索的内容,但在 Ubuntu 中找不到它。我正在运行 Ubuntu 14.04.3 LTS。
这只是我有兴趣更改的登录屏幕的超时,而不是成功登录后的会话超时。我正在通过 VMware vSphere 通过控制台登录。出于安全考虑,SSH 已关闭。出于安全考虑,删除了复制/粘贴选项。
我想让 Linux 只使用 sys_read 从键盘上进行 1 次击键,但 sys_read 只是等到我按下 Enter 键。如何读取 1 个按键?这是我的代码:
Mov EAX,3
Mov EBX,0
Mov ECX,Nada
Mov EDX,1
Int 80h
Cmp ECX,49
Je Do_C
Jmp Error
Run Code Online (Sandbox Code Playgroud)
我已经尝试使用 BIOS 中断但它失败了(分段错误),我想从键盘捕获数字 1 到 8 输入。
阅读了包括http://www.linusakesson.net/programming/tty/在内的各种资源后, 我仍然对伪终端的结构和使用感到困惑和好奇在 linux 终端(bash 不是 tty)中,我们有三个流:
每个都有一个文件描述符。这些文件描述符映射到流 FILE*。例如,我们可以使用 fileno() 和 fdopen() 在它们之间进行切换。
我可以用 pty 做什么?
我通常认为 stdout、stdin 和 stderr 与进程相关联。我认为说有一个与 pty 相关联的 stdout、stdin 和 stderr 是不正确的。那么给定一个 pty(对于像 bash 这样的进程而不是它的 pid),你如何获得它们并将它们连接到 bash 意义上的终端?
单个文件描述符(对于 pty)如何映射到三个流?(显然它没有)它可以以某种方式映射到进程吗?
在使用 openpty() 时,我认为要连接主终端和从终端上的进程,您需要为 stdin、stdout 和 stderr 设置单独的管道,并有一个选择循环连接它们并在它们之间传输数据。
但是,您是否可以假设 stdin 和 stdout 已连接(通过 tty)并仅设置一个 stderr 管道以避免合并 stdout 和 stderr?
如果我们有一个 master 和 slave 进程,“额外”的 tty 实际上为我们做什么?
以下是我认为我知道并且相关的一些事情:
所述openpty()函数返回一对表示的伪终端的主设备和从设备的端部的文件描述符。
每个文件描述符指向字符设备 - 见https://man7.org/linux/man-pages/man7/pty.7.html
现在 Unix 中的设备只是特殊文件,因此文件描述符是有意义的。
bash 终端具有三个流,但 tty …