【问题标题】:Understanding tty + bash了解 tty + bash
【发布时间】:2018-02-28 22:13:24
【问题描述】:

我发现我可以使用一个 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 文件。)

【问题讨论】:

  • 有什么原因不能使用 FIFO 并从中读取密码?
  • @Cez :您的意思是在使 FIFO 重定向 ssh 以从中读取之后?喜欢ssh myserver < myfifo?根据我最近的经验,ssh 命令似乎拒绝从重定向中读取密码。我不确定机制是什么,但我想这是一种安全措施。你知道吗?
  • @Cez :我刚刚重复了我认为你提出的实验,使用我上面评论中给出的命令。没有效果。
  • 我认为任何 ssh 相关的应用程序都不会接受来自标准输入的密码。你会更好地自动化密钥复制。
  • @JellicleCat 我添加了一个答案,告诉你我的意思

标签: bash tty


【解决方案1】:

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

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

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

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

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

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

不是通过写终端,不是。

【讨论】:

    【解决方案2】:

    这是一个使用 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 取决于您

    【讨论】:

    • +1 谢谢。我不知道sshfspassword_stdin 选项,因为ssh 不存在该选项。
    猜你喜欢
    • 1970-01-01
    • 2017-04-02
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    相关资源
    最近更新 更多