首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解tty + bash

理解tty + bash
EN

Stack Overflow用户
提问于 2018-02-28 22:13:24
回答 3查看 1.7K关注 0票数 3

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

代码语言:javascript
复制
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文件。)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-02-28 23:04:05

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

输入和输出是两种不同的东西。

将数据写入终端将数据显示在屏幕上。从终端读取从键盘读取输入。写到终端绝不是模拟键盘输入。

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

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

有什么可以用这种方式来执行我的脚本吗?

不是通过写信给终端机,不是。

票数 4
EN

Stack Overflow用户

发布于 2018-02-28 23:36:46

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

代码语言:javascript
复制
#!/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取决于您。

票数 2
EN

Stack Overflow用户

发布于 2022-10-17 15:39:09

您可以通过使用ioctl系统调用来完成所需的任务:

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

对于这个系统调用的“请求”参数,您需要TIOCSTI,它在我的头文件中被定义为0x5412。(grep -r TIOCSTI /usr/include用于验证您的环境。)

我在红宝石中完成了以下工作:

代码语言:javascript
复制
fd = IO.sysopen("/proc/#{$$}/fd/0", 'wb')
io = IO.new(fd, 'wb')
"puts 9 * 16\n".chars.each { |c| io.ioctl 0x5412, c };
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49039489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档