【问题标题】:Fool a program run from within a shell script into thinking it's reading from a terminal欺骗从 shell 脚本中运行的程序,使其认为它正在从终端读取
【发布时间】:2011-04-10 08:41:38
【问题描述】:

我想编写一个 shell 脚本来执行以下操作

while read line; do
echo $line 
done<input.txt | ssh > output.txt

目前这有点伪代码(原件正在工作),但您应该能够知道它在做什么。对于简单的应用程序,这是一种享受,但 ssh 会检查输入以查看它的标准输入是否是终端。

有没有办法让 ssh 认为我的管道循环的内容是终端而不是管道?

编辑:很抱歉最初没有添加,这是为了允许 ssh 通过 shell 脚本登录(回答密码提示)

【问题讨论】:

  • 冷静下来,不要以为我不知道这一点。这是当前的方法,但是要将密钥放在服务器上,它仍然需要提示一次密码。
  • 首先,刚刚编辑了你的问题,说你需要一些东西来伪造键盘登录。我确实不认为那样。如果您要颠覆它以在某个服务器上获取您的密钥,那么就不再有安全密钥了。顺便说一句,我会用更有用的提示更新我的答案。
  • 如果它用于 ssh - 你不能制作一个适合 shh 的 SSH_ASKPASS env var 的脚本吗? (SSH(1))。只是一个想法,没有尝试过
  • (edited) AHHHHH - 使用公钥认证?网上至少有一百亿个常见问题解答。有什么理由不能用吗?

标签: bash ssh sh


【解决方案1】:

ssh -t -t 会做你想做的事——这告诉 ssh 分配一个伪终端,无论它是否实际运行在一个终端中。

【讨论】:

  • 不会分配伪终端,因为stdin不是终端
  • @sehe: -t 是“强制伪 tty 分配”。
  • 试试看:echo hello | ssh -t localhost cat
  • @sehe:你试试看。 -t 强制分配,-t -t 强制分配,即使标准输入不是终端。
  • @sehe:它不会影响密码输入 - 但如果你这样做,例如echo w | ssh -t -t foobox 它会将您列为已使用 pty 登录。这是否解决了 OPs 问题还有待观察——因为他没有具体说明他真正想要解决的问题。
【解决方案2】:

更新

这个问题(在更新了您的问题和各种 cmets 之后,很明显您正在寻找一种方便地进行公钥加密的方法)也许可以通过“颠倒思考”来解决。

您可以尝试从该服务器接收经过身份验证的身份(私钥),而不是非常努力地将您的客户端公钥获取到尚未对客户端进行身份验证的服务器上。

简单来说:在服务端而不是客户端生成keypair,然后想办法在客户端获取keypair。服务端可以提前把公钥放到它的authorized_keys中,这样客户端就可以马上连接了。

很有可能

  • 获取密钥的问题更容易解决(您甚至可以使用“组”密钥从各种客户端访问)
  • 如果选择了一种不太安全的机制(方便而不是安全),至少只会降低客户端的安全性,而不是降低服务器的安全性(直接)。

原答案:

简短回答:不。 (这将是 ssh 的一个安全漏洞,因为 ssh '信任' tty 来输入密码,并且只信任 tty)

长答案,您可以尝试颠覆/创造性地使用终端模拟器(查看 script/scriptreplay 以获得灵感)。

你为什么要这样做?

【讨论】:

  • 我不明白这是一个安全漏洞,例如,我可以使用密钥,然后不需要密码,并一次传递一个命令。
  • 好吧,您明确表示另一个应用程序不是 ssh)需要 tty。需要详细说明吗?
  • 对不起,这个问题应该措辞更好。感谢您的回答,我将创造性地使用终端仿真器进行研究,因为目标和目的地都是可以互换的。我确实意识到这对你来说听起来有多疯狂;)
猜你喜欢
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 2010-11-26
相关资源
最近更新 更多