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

원격 사용자( user2on server2) 의 로그인 셸이 이면 호출될 때 대화형이 아닌 경우에도( 사용자가 제공한 것을 단지 해석하는 경우와 같이 ) 읽고 해석합니다 bash( 원격 시스템에서 가능하거나 이에 상응하는 것). .bash~/.bashrc/etc/bash.bashrcssh/bin/cat > user2@server2:/......./test.sql.gz

에 있는 것들이 또는 ( from에서 ~/.bashrc) 같은 일을 하지 않도록 하세요.sttymesgmesgsysvinit-utils많은 Linux 배포판에서 볼 수 있는 것처럼 )을 실행하여 볼 수 있는 것과 정확히 동일한 메시지를 출력하거나 : | mesg nstdin이 터미널 [ -t 0 ]이고 쉘이 대화형인지 확인한 후에만 출력하는 것으로 알려져 있습니다( case $- in (*i*) ...;; esac).

원격 사용자의 로그인 셸이 csh또는 인 경우 호출 여부에 관계없이 비대화형 셸을 포함하여 모든 셸에서 해석되는 및 및 for를 살펴 tcsh보세요 (그러나 따라서 일반적으로 작업을 수행하지 않음). 무조건 )..cshrc.tcshrczsh~/.zshenvsshtty

이로 인해 명령이 실패하는 것이 아니라 가짜 메시지만 표시된다는 점에 유의하십시오.

하지만 명령이 실패하는 원인은 다음과 같습니다.

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

on user2@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으로 및 를 제거할 수도 있습니다. 무엇이 무엇인지 확인하세요.~/.bashrcssh~/.bashrccat ...catmysqldump

관련 정보