我想在另一台服务器上转储表备份,而我正在使用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.
为什么会出现这个错误?
答案 0 :(得分:11)
在使用ssh -t -t
或ssh -tt
强制进行伪终端分配时,我看到了这个错误。
tcgetattr
函数用于查找由文件描述符表示的伪终端的属性;它需要一个文件描述符和一个指向termios结构的指针来存储终端元数据。它从stub code in glibc看起来这个错误表示termios
结构的空指针。我不确定这些相同的错误处理语义是否适用于tcgetattr
的特定于平台的实现。
如果您想要取消此错误,请像这样调用ssh
:
ssh 2>/dev/null
这会将STDERR重定向到/dev/null
;使用此重定向调用时,您将看不到错误。请注意,这将掩盖ssh
的其他错误;您可能需要将其删除以进行调试。
答案 1 :(得分:4)
在我的情况下,在两级ssh调用的外部ssh上强制pty分配修复了问题。
详细说明:
当您提供ssh运行命令时(例如ssh some_server“do_some_command”),ssh假设您不需要交互式会话,并且它不会分配pty,因为它提交了您提出的“do_some_command”作业它来。
然而,如果你有两层ssh,那么事情会变得有趣(例如,假设你想首先将ssh引入一个“网关”机器,然后从那里你进入一个“内部”机器并运行一些“inner_command”)。
问题是,从外部ssh的角度来看,使用双层ssh'ing作业,你要求外部ssh运行非交互式命令,因此外部ssh不会分配tty。 / p>
如果你在内部ssh中运行的命令是交互式的,它可能想要查询tty属性,它会(正确地)抱怨它没有在tty上运行。
我的解决方案是使用-t参数强制外部ssh分配pty。所以它看起来像这样:
ssh -t< gateway_machine> “ssh< inner_machine> \”< inner_interactive_command> \“”
向那里的系统管理员致以问候