Understanding tty + bash



我看到我可以使用一个 bash 会话在另一个会话中打印文本,如下所示

echo './myscript' > /dev/pts/0 # assuming session 2 is using this tty
# or
echo './myscript' > /proc/1500/fd/0 # assuming session 2's pid is 1500

但是为什么文本./myscript只打印而不执行呢?我可以做些什么来以这种方式执行我的脚本?

(我知道这会引起很多批评,这些批评可能会填补"不要那样做!"后面的任何答案,但我希望这样做的真正原因是自动向sshfs提供密码。我正在使用本地WDMyCloud系统,每天晚上关闭电源时,它会删除我的.authorized_keys文件。

为什么文本 ./myscript 只打印而不执行?

输入和输出是两回事。

写入终端会将数据放在屏幕上。从终端读取从键盘读取输入。写入终端绝不会模拟键盘输入。

输入和输出之间没有固有的耦合,你按下的键显示在屏幕上是一个有意识的设计决策:shell 只是读取一个键,然后将其附加到其内部命令缓冲区,并将副本写入屏幕。

这纯粹是为了您的利益,因此您可以看到您正在键入的内容,而不是因为 shell 以任何方式关心屏幕上的内容。由于它没有,将更多内容写入屏幕对 shell 执行的内容没有影响。

我可以做些什么来以这种方式执行我的脚本?

不是通过写入终端,不是。

下面是一个使用 FIFO 的示例:

#!/usr/bin/bash
FIFO="$(mktemp)"
rm -fv "$FIFO"
mkfifo "$FIFO"
( echo testing123 > "$FIFO" ) &
cat "$FIFO" | sshfs -o password_stdin testing@localhost:/tmp $HOME/tmp

如何存储密码并将其发送到FIFO

取决于您

您可以使用 ioctl 系统调用来完成所需的操作:

ioctl() 系统调用操作特殊文件的底层设备参数。 特别是,字符特殊文件(例如终端)的许多操作特征可以通过 ioctl() 请求进行控制。

对于此系统调用的"request"参数,您需要TIOCSTI,它在我的头文件中定义为0x5412。(grep -r TIOCSTI /usr/include验证您的环境。

我在红宝石中按如下方式完成此操作:

fd = IO.sysopen("/proc/#{$$}/fd/0", 'wb')
io = IO.new(fd, 'wb')
"puts 9 * 16n".chars.each { |c| io.ioctl 0x5412, c };

相关内容

  • 没有找到相关文章

最新更新