当SSH用于另一台服务器上倾销备份文件为什么看到`tcgetattr`错误?(why is the

2019-09-24 03:37发布

我想倾倒另一个服务器上的表备份,我使用ssh这样做。 当我运行下面的命令,它提供了一个错误,但转储文件复制到目的地。

mysqldump -u username -ppassword dbname tablename | ssh -t -t servers_username@domain_name 'cat > /tmp/bckp.sql';

tcgetattr:无效的参数

如果我按下CTRL + C然后其追加错误消息与Killed by signal 2.

这是为什么错误?

Answer 1:

使用迫使伪终端分配时,我已经看到了这个错误ssh -t -tssh -tt

tcgetattr函数用于查找由一个文件描述符表示的伪终端的属性; 它需要一个文件描述符和一个指向termios结构存储在终端的元数据。在我看来从存根代码在glibc的 ,这个错误代表了一个空指针termios结构。 我不知道这些相同的错误处理的语义是否到位的特定于平台的实现tcgetattr

如果要抑制这种错误,调用ssh就像这样:

ssh 2>/dev/null

这将STDERR重定向到/dev/null ; 这种重定向调用时,你会不会看到错误。 请注意,这会掩盖其他错误的ssh ; 您可能需要删除此进行调试。



Answer 2:

在我的情况下,强制在两个级别的ssh调用的外部SSH PTY分配固定的问题。

细节:

当您为ssh来运行一个命令(如SSH some_server“do_some_command”),然后SSH假定您将不再需要一个交互式会话,并作为其提交你问它的“do_some_command”工作就不会分配PTY。

然而,事情就变得有趣,如果你有SSH的两层(例如,假设你想ssh到“网关”机先,并从那里你ssh到“内”机器上并运行一些“inner_command”)。

问题是,有两层ssh'ing工作,从外SSH的角度来看,您请求外SSH运行一个非交互式命令,因此外ssh将不分配一个tty。

如果您是在内部运行SSH命令,就是要互动,这可能会想要查询的tty的属性,它会(理直气壮)抱怨说,它没有被上一个tty运行。

在我的情况的解决方案是迫使外ssh来分配一个PTY,通过使用-t参数。 因此,它是这样的:

SSH -t <gateway_machine> “SSH <inner_machine> \”<inner_interactive_command> \”“

问候系统管理员那里



文章来源: why is the `tcgetattr` error seen when ssh is used for dumping the backup file on another server?