我想倾倒另一个服务器上的表备份,我使用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.
这是为什么错误?
我想倾倒另一个服务器上的表备份,我使用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.
这是为什么错误?
使用迫使伪终端分配时,我已经看到了这个错误ssh -t -t
或ssh -tt
。
该tcgetattr
函数用于查找由一个文件描述符表示的伪终端的属性; 它需要一个文件描述符和一个指向termios结构存储在终端的元数据。在我看来从存根代码在glibc的 ,这个错误代表了一个空指针termios
结构。 我不知道这些相同的错误处理的语义是否到位的特定于平台的实现tcgetattr
。
如果要抑制这种错误,调用ssh
就像这样:
ssh 2>/dev/null
这将STDERR重定向到/dev/null
; 这种重定向调用时,你会不会看到错误。 请注意,这会掩盖其他错误的ssh
; 您可能需要删除此进行调试。
在我的情况下,强制在两个级别的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> \”“
问候系统管理员那里