docker run -it ssh:input设备不是TTY
我想通过ssh命令直接交互式运行docker container。
我现在的代码如下所示(我使用echo hi
作为占位符):
$ ssh vagrant@127.0.0.1 -p 2222 "docker run -ti ubuntu:xenial echo hi" the input device is not a TTY
我也试着明确地做一个交互式的loginshell:
$ ssh vagrant@127.0.0.1 -p 2222 "bash -ilc 'docker run -ti ubuntu:xenial'" bash: cannot set terminal process group (-1): Inappropriate ioctl for device bash: no job control in this shell the input device is not a TTY
如果我SSH和交互式运行命令,它的工作原理:
$ ssh vagrant@127.0.0.1 -p 2222 Welcome to Ubuntu 14.04.5 LTS (GNU/Linux 4.4.0-34-generic x86_64) * Documentation: https://help.ubuntu.com/ ---------------------------------------------------------------- Ubuntu 14.04.5 LTS built 2016-08-26 ---------------------------------------------------------------- Last login: Mon Oct 30 23:25:35 2017 from 10.0.2.2 vagrant@vagrant:~$ docker run -ti ubuntu:xenial echo hi hi
我在这里错过了什么?
在参数列表上传递显式命令时,SSH不会默认设置TTY(与运行远程交互式shell作为默认操作相反)。 要解决这个问题,请添加-tt
:
$ ssh -tt vagrant@127.0.0.1 -p 2222 "docker run -ti ubuntu:xenial echo hi"
当且仅当本地TTY存在时,单个-t
将设置远程TTY; -tt
无条件地这样做。
RequestTTY
选项也可以在命令行中显式设置:
$ ssh -o 'RequestTTY force' vagrant@127.0.0.1 -p 2222 \ > 'docker run -ti ubuntu:xenial echo hi'
…或者在~/.ssh/config
:
Host vagrant HostName 127.0.0.1 Port 2222 User vagrant RequestTTY force
用作:
ssh vagrant 'docker run -ti ubuntu:xenial echo hi'
引用ssh
的手册页 :
-t
– 强制伪terminal分配。 这可以用来在远程机器上执行任意基于屏幕的程序,这可能是非常有用的,例如在实现菜单服务时。 多个-t
选项强制tty分配,即使ssh没有本地tty。
引用ssh_config
手册页 :
RequestTTY
– 指定是否为会话请求一个伪tty。 参数可以是:no
(从不请求TTY),yes
(当标准input是TTY时总是请求TTY),force
(总是请求TTY)或auto
(在打开login会话时请求TTY)。 该选项镜像ssh(1)的-t和-T标志。
- 如何访问由docker的HyperKit创build的虚拟机?
- 从Docker运行改为Docker-compose; 关于集装箱间networking通信的不可预知的行为
- 在mysql中插入用户定义的variablesCREATE USER
- 如何在Mac上运行Jenkins的docker构build?
- 赏金! 使用Docker + Kitura,但不能在Mac上使用
- 最简单的Dockerfile解压:找不到文件
- 在Docker中运行一个可执行的二进制文件(带有JET Excelsior)
- 我可以从其他docker集装箱种植一个mongodbdocker集装箱吗?
- 在群体闲置一段时间后到达docker集装箱的高延迟