1

我有一个简短的简单脚本,它编译一个.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
4

3 回答 3

1

该消息实际上是由 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'

或者,只需将复杂的命令作为单行程序运行。

# this will work as well
ssh user@dest "cd cs4400/$dest;gcc -o $efile $file;./$efile"
于 2020-05-05T15:29:01.353 回答
1

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

-T 禁用伪终端分配。

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

于 2016-02-28T11:37:49.733 回答
0

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

ssh -T user@server bash << EOF
cd cs4400/$dest
gcc -o $efile $file
./$efile
EOF
于 2021-02-02T14:02:03.550 回答