我有一个简短的简单脚本,它编译一个.c文件并在运行tcsh的远程服务器上运行,然后将控制权还给我的机器(这是为了上学,我需要我的程序在实验室计算机上正常工作,但希望在我的机器上编辑它们等等)。它以这样的方式运行命令:
ssh -T user@server << EOF
cd cs4400/$dest
gcc -o $efile $file
./$efile
EOF到目前为止,它运行良好,但每次我这样做都会发出这样的警告:
Warning: no access to tty (Bad file descriptor).
Thus no job control in this shell.我知道这在技术上不是个问题,但这太烦人了。我试着做功课,检查我的节目输出等等,这扰乱了一切,我讨厌它。
我正在我的机器上运行这个版本的ssh:
OpenSSH_6.1p1 Debian-4, OpenSSL 1.0.1c 10 May 2012服务器上的这个版本的tcsh:
tcsh 6.17.00 (Astron) 2009-07-10 (x86_64-unknown-linux)服务器上的这个版本的ssh:
OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 Mar 2010发布于 2020-05-05 15:29:01
消息实际上是由shell打印的,在本例中是tcsh。您可以使用
strings /usr/bin/tcsh | grep 'no access to tty'以确保它属于tcsh本身。
它与ssh的关系非常松散(本例中的ssh只是触发器,而不是原因)。
您应该要么改变您的方法,而不是使用HERE DOCUMENT。相反,将可执行的custom_script放入/path/custom_script并通过ssh运行。
# this will work
ssh user@dest '/path/custom_script'或者,只需运行复杂的命令作为一个oneliner。
# this will work as well
ssh user@dest "cd cs4400/$dest;gcc -o $efile $file;./$efile"发布于 2016-02-28 11:37:49
在OS上,我用ssh -t -t解决了一个类似的问题(Vagrant上的脚本配置)(注意,-t来了两次)。基于ssh BSD手册页的建议:
-T禁用伪终端分配. -t强制伪终端分配.这可以用于在远程计算机上执行基于屏幕的任意程序,这是非常有用的,例如在实现菜单服务时。多个-t选项强制分配tty,即使ssh没有本地tty。
发布于 2021-02-02 14:02:03
如果运行tcsh对您不重要,请指定一个不同的shell,它将工作:
ssh -T user@server bash << EOF
cd cs4400/$dest
gcc -o $efile $file
./$efile
EOFhttps://stackoverflow.com/questions/18855989
复制相似问题