因为stdin不是终端,所以不会分配伪终端


14

我正在尝试通过没有nc的服务器设置自动SSH跳跃。

这可以从命令行进行:

ssh -A gateway ssh steve@target

(我已将公共密钥添加到SSH代理中)。

但是,将其添加到〜/ .ssh / config不会:

Host target
  User steveb
  ProxyCommand ssh -A gateway ssh steve@targetip

$ ssh target
Pseudo-terminal will not be allocated because stdin is not a terminal.


^CKilled by signal 2.

试图强行解决问题-t很有趣,但无济于事。

ProxyCommand ssh -A -t gateway ssh steve@targetip

$ ssh target
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.


^CKilled by signal 2.

还有更多-t?不好。

ProxyCommand ssh -A -t -t gateway ssh steve@targetip

$ ssh target
tcgetattr: Inappropriate ioctl for device


^CKilled by signal 2.

这可能吗?大多数教程(例如http://www.arrfab.net/blog/?p=246)都建议使用nc


结论是需要netcat吗?
Monica的MountainX

看起来像。在这种情况下,我能够安装它,解决了我的问题-但我并不总是那么奢侈。
Steve Bennett

请参阅下面的答案,以两种无需netcat即可完成此操作的方式。
Monica的MountainX

Answers:


13

没有netcat的SSH ProxyCommand

当只能间接访问主机时,ProxyCommand非常有用。对于netcat来说,这是相对困难的事情:

ProxyCommand ssh {gw} netcat -w 1 {host} 22

这里{gw}和{host}是网关和主机的占位符。

但是,当网关上未安装netcat时,也有可能:

ProxyCommand ssh {gw} 'exec 3<>/dev/tcp/{host}/22; cat <&3 & cat >&3;kill $!'

/ dev / tcp是标准bash的内置功能。文件不存在。要检查bash是否具有内置此功能,请运行:

cat < /dev/tcp/google.com/80 

...在网关上。

要确保使用bash,请使用:

ProxyCommand ssh {gw} "/bin/bash -c 'exec 3<>/dev/tcp/{host}/22; cat <&3 & cat >&3;kill $!'"

它甚至可以与ControlMaster一起使用。

(于10月22日更新,其中包括杀死以清理背景猫的行为)(于2011年3月3日更新,以使占位符更加清晰并解释/ dev / tcp)

罗兰·舒尔茨100%的功劳。这是源:
http : //www.rschulz.eu/2008/09/ssh-proxycommand-without-netcat.html在此处的
注释中查看更多有用的信息。

这里还有更多内容:
http : //www.linuxjournal.com/content/tech-tip-tcpip-access-using-bash
http://securityreliks.securegossip.com/2010/08/enabling-devtcp-on-backtrack -4r1ubuntu /

更新:这是Marco的新内容

参考〜/ .ssh / config中的ProxyCommand,其中有这样一行:

ProxyCommand ssh gateway nc localhost %p

Marco说:

如果使用最新版本的OpenSSH,则不需要netcat。您可以用-W localhost:%p替换nc localhost%p。

结果将如下所示:

ProxyCommand ssh gateway -W localhost:%p

8

大T,不小T。

-T' Disable pseudo-tty allocation.
-t' Force pseudo-tty allocation. 

我的脚本曾经用于返回该消息,并且不再返回。

/usr/bin/ssh -T -q -i $HOME/.ssh/one_command other_system

authorized_key在other_system上使用,使它运行命令:

from="my.mydomain.com",command="bin/remotely-run" ssh-rsa ... 

3

试试看:

ProxyCommand ssh -A -t gateway ssh -t steve@targetip

等等,这与我尝试过的有什么不同?
史蒂夫·贝内特

@SteveBennett的区别在于,这不仅尝试在第二个系统上分配TTY,而且还尝试在第一个系统上分配TTY。
Hauke Laging

这与我提到的“有趣但无益”的结果完全相同吗?
史蒂夫·贝内特

@SteveBennett我确实读错了。我的目标是-t在两种连接方式中都使用,但我发现连接错误。我已经编辑了答案。
Hauke Laging

啊。好吧,仍然没有好处。尝试了所有组合。
史蒂夫·贝内特

-3

您可以尝试以下将ssh'放入server1,然后再ssh'进入server2的技术。

$ ssh -t user1@server1 ssh -t user2@server2 

这样做对我有用。


1
请解释更多...此命令的作用以及如何解决答案。
Tejas 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.