6

我想在另一台服务器上转储表备份,我正在使用 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.

为什么会出现这个错误?

4

2 回答 2

11

我在使用ssh -t -tor强制伪终端分配时看到了这个错误ssh -tt

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

如果要抑制此错误,请ssh像这样调用:

ssh 2>/dev/null

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

于 2013-01-14T16:20:20.263 回答
4

就我而言,在两级 ssh 调用的外部 ssh 上强制分配 pty 解决了这个问题。

细节:

当您为 ssh 提供运行命令(例如 ssh some_server "do_some_command" )时,ssh 假定您不需要交互式会话,并且在提交您要求的“do_some_command”作业时它不会分配 pty。

但是,如果您有两层 ssh,事情就会变得有趣(例如,假设您想先 ssh 进入“网关”机器,然后从那里 ssh 进入“内部”机器并运行一些“inner_command”)。

问题是,对于两层 ssh 作业,从外部 ssh 的角度来看,您要求外部 ssh 运行非交互式命令,因此外部 ssh 不会分配 tty。

如果您在内部 ssh 中运行的命令是交互式的,它可能会想要查询 tty 属性,并且它会(正确地)抱怨它没有在 tty 上运行。

在我的情况下,解决方案是使用 -t 参数强制外部 ssh 分配一个 pty。所以它看起来像这样:

ssh -t <gateway_machine> "ssh <inner_machine> \"<inner_interactive_command>\" "

问候系统管理员

于 2014-09-04T23:45:08.453 回答