stdin : 不在 tty 中

stdin : 不在 tty 中

我正在尝试通过在 ssh 中使用以下命令从 server1 到 server2 进行备份

[user1@server1 ~]$ mysqldump -u dbuser -p"dbpwd" --opt  dbname        \
                      | gzip -c                                       \
                      | ssh  -o StrictHostKeyChecking=no              \
                             -o UserKnownHostsFile=/...../known_hosts \
                             -l deploy                                \
                             -i  /...../id_rsa                        \
                             -v  user2@server2                        \
                             "/bin/cat > /.../test.sql.gz" \
                      2>&1 

我收到如下错误

debug1: Sending command: /bin/cat > -t user2@server2:/..../test.sql.gz
stdin: is not a tty
/bin/cat: user20@server2:/..../test.sql.gz
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: client_input_channel_req: channel 0 rtype [email protected] reply 0
: No such file or directory
debug1: channel 0: free: client-session, nchannels 1
debug1: fd 0 clearing O_NONBLOCK
Transferred: sent 265040, received 2552 bytes, in 0.0 seconds
Bytes per second: sent 6736670.0, received 64865.6
debug1: Exit status 1
mysqldump: Got errno 32 on write

任何人都可以解决这个问题吗?

更新

我从备份命令中删除了“user2@server2”和“deploy -i”并运行它。它给了我以下消息

debug1: Sending env LANG = en_US.UTF-8
debug1: Sending command: /bin/cat > -t /....../test.sql.gz
stdin: is not a tty
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: client_input_channel_req: channel 0 rtype [email protected] reply 0
/bin/cat: /......./test.sql.gz: No such file or directory
debug1: channel 0: free: client-session, nchannels 1
debug1: fd 0 clearing O_NONBLOCK
Transferred: sent 248608, received 2536 bytes, in 0.1 seconds
Bytes per second: sent 4628197.5, received 47211.3
debug1: Exit status 1
mysqldump: Got errno 32 on write

答案1

user2如果远程用户 ( on server2)的登录 shell是bash,请注意在调用时bash读取和解释~/.bashrc(可能或远程系统上的等效内容) ,即使不是交互式的(例如当它只是解释您提供的内容时) 。/etc/bash.bashrcssh/bin/cat > user2@server2:/......./test.sql.gz

确保 中的内容~/.bashrc不会执行类似sttyor 的操作mesgmesg来自sysvinit-utils正如许多 Linux 发行版中所发现的那样,它会输出与运行 ) 所看到的完全相同的消息: | mesg n,或者仅在检查 stdin 是终端[ -t 0 ]并且 shell 是交互式的之后才执行此操作 ( case $- in (*i*) ...;; esac)。

如果远程用户的登录 shell 是cshor tcsh,请查看每个 shell 解释的.cshrcand.tcshrc和 for zsh~/.zshenv包括非交互式 shell,无论它们是否被调用ssh(但因此,它们通常不会执行任何操作)无条件tty地)。

请注意,这不会导致您的命令失败,只会显示虚假消息。

导致命令失败的原因是:

 /bin/cat > user2@server2:/......./test.sql.gz

When 没有多大意义,除非onuser2@server2:的主目录中有一个被调用的目录。user2server2

这可能就是导致错误的原因:

 : No such file or directory

事实上,它所抱怨的“文件或目录”似乎是“空的”,这表明命令行中的某处隐藏着一个回车符。

你想要的是/bin/cat > /path/to/output/file/on/server2/test.sql.gz,并且该/path/to/output/file/on/server2目录必须事先存在。

您可能还想暂时删除-v~/.bashrc,因为目前我们正在看到来自ssh、 在您的 中运行的命令的消息~/.bashrc,可能是由远程 shell 在解释该cat ...命令行时通过catmysqldump命令发送的,这使得很难看看是什么。

相关内容