Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 抑制';警告:无法访问tty';宋承宪_Linux_Ssh_Tcsh_Tty - Fatal编程技术网

Linux 抑制';警告:无法访问tty';宋承宪

Linux 抑制';警告:无法访问tty';宋承宪,linux,ssh,tcsh,tty,Linux,Ssh,Tcsh,Tty,我有一个简短的脚本,它编译了一个.c文件,并在运行tcsh的远程服务器上运行它,然后将控制权返回给我的机器(这是学校用的,我需要我的程序在实验室计算机上正常工作,但想在我的机器上编辑它们等等)。它以这种方式运行命令: ssh -T user@server << EOF cd cs4400/$dest gcc -o $efile $file ./$efile EOF 我知道从技术上讲这不是问题,但它非常烦人。我正试着做功课,检查我的程序的输出等等,这把一切都搞得乱七八糟,我讨厌这样

我有一个简短的脚本,它编译了一个
.c
文件,并在运行
tcsh
的远程服务器上运行它,然后将控制权返回给我的机器(这是学校用的,我需要我的程序在实验室计算机上正常工作,但想在我的机器上编辑它们等等)。它以这种方式运行命令:

ssh -T user@server << EOF
cd cs4400/$dest
gcc -o $efile $file
./$efile
EOF
我知道从技术上讲这不是问题,但它非常烦人。我正试着做功课,检查我的程序的输出等等,这把一切都搞得乱七八糟,我讨厌这样

我正在我的计算机上运行此版本的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)
OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 Mar 2010
服务器上此版本的ssh:

tcsh 6.17.00 (Astron) 2009-07-10 (x86_64-unknown-linux)
OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 Mar 2010

在OSX上,我用
ssh-t-t
(注意
-t
出现了两次)解决了类似的问题(对于Vagrant上的脚本配置)。 基于ssh BSD手册页的建议:

-T禁用伪终端分配

-t强制伪终端分配。这可用于在远程计算机上执行任意基于屏幕的程序,该程序可以 非常有用,例如在实施菜单服务时。多个-t选项强制tty分配,即使ssh没有本地tty


消息实际上是由shell打印的,在本例中为tcsh。 你可以用

strings  /usr/bin/tcsh | grep 'no access to tty'
确保它属于
tcsh
本身

它与ssh的关系非常松散,即
ssh
,在本例中,它只是触发器,而不是原因

您应该改变方法,不要使用
此处文档
。而是将可执行的自定义脚本放入
/path/custom\u script
中,并通过ssh运行它

# this will work
ssh user@dest '/path/custom_script'
或者,只需将复杂命令作为一行程序运行即可

# this will work as well
ssh user@dest "cd cs4400/$dest;gcc -o $efile $file;./$efile"

如果运行
tcsh
对您来说并不重要,请指定一个不同的shell,它将工作:

ssh -T user@server bash << EOF
cd cs4400/$dest
gcc -o $efile $file
./$efile
EOF

ssh-Tuser@serverbash当
-T
显式禁用tty分配时,我很确定您希望
-T
显式启用tty分配并消除错误。啊,是的,我应该记得对此说些什么。在尝试解决另一个问题之前,我已经这样做了,下面是更改所带来的结果:
伪终端将不会被分配,因为stdin不是终端。
这是在我之前的警告之外给出的。