내 문제는 ssh 셸에 로그인 할 때마다 몇 가지 변수를 설정하고 몇 줄을 출력해야하며 동시에 Filezilla를 통해 sftp를 사용하여 파일을 tarnsfer 할 수 있어야한다는 것입니다.
이제 http://www.openssh.org/faq.html 의 openssh FAQ에 따라 시작 스크립트가 모든 종류의 출력을 출력하면 sftp와 충돌합니다. 따라서 무한정 지연되거나 “종료 코드 128의 서버에 의해 연결이 닫힘”으로 오류가 발생합니다.
.bashrc를 .bash_profile으로 옮기거나 .bashrc에서 다음 코드를 사용하는 것과 같은 솔루션을 시도했습니다.
if [ "$TERM" != "dumb" ]
then
source .bashc_real
fi
과:
if [ "$TERM" = "xterm" ]
then
source .bashc_real
fi
그러나 아무것도 작동하지 않습니다. 내 쉘 터미널은 bash이며 filezilla를 사용하여 sftp에 연결합니다.
답변
대신 이것을 시도하십시오
if [ "$SSH_TTY" ]
then
source .bashc_real
fi
답변
마이크의 대답은 아마 효과가있을 것입니다. 그러나 자세한 내용을 넣을 시작 파일을 신중하게 선택 하여이 작업을 수행 할 수 있음을 지적하는 것이 좋습니다. bash 매뉴얼 페이지에서 :
bash가 대화식 로그인 쉘 또는 –login 옵션을 사용하는 비 대화식 쉘로 호출되면 파일이 존재하는 경우 먼저 / etc / profile 파일에서 명령을 읽고 실행합니다. 해당 파일을 읽은 후 ~ / .bash_profile, ~ / .bash_login 및 ~ / .profile을 순서대로 찾고 존재하고 읽을 수있는 첫 번째 파일에서 명령을 읽고 실행합니다. 이 동작을 막기 위해 쉘을 시작할 때 –noprofile 옵션을 사용할 수 있습니다.
로그인 쉘이 아닌 대화식 쉘이 시작될 때 bash는 ~ / .bashrc에서 해당 파일이있는 경우 명령을 읽고 실행합니다. –norc 옵션을 사용하여이를 방지 할 수 있습니다. –rcfile 파일 옵션은 bash가 ~ / .bashrc 대신 파일에서 명령을 읽고 실행하도록합니다.
sftp / scp 도구는 대화식 비 로그인 셸을 시작하므로 .bashrc가 제공됩니다. 많은 배포판이 .bash_profile에서 .bashrc를 소스로 또는 그 반대로 소스를 혼동하므로 혼동 될 수 있습니다. 로그인 환경의 청결도를 테스트하는 좋은 방법은 scp / sftp가 연결하는 것과 동일한 방법으로 시뮬레이션하는 명령을 사용하는 것입니다. 예를 들어 : ssh myhost /bin/true
scp / sftp가 연결될 때 표시되는 내용을 정확하게 보여줍니다.
간단한 데모 :
insyte@mazer:~$ echo "echo Hello from .profile" > .profile
insyte@mazer:~$ echo "echo Hello from .bashrc" > .bashrc
sazerac:~ insyte$ ssh mazer /bin/true
Hello from .bashrc
sazerac:~ insyte$
insyte@mazer:~$ rm .bashrc
sazerac:~ insyte$ ssh mazer /bin/true
sazerac:~ insyte$
첫 번째 테스트는 scp / sftp / rsync 등을 중단시킵니다. 두 번째 버전은 잘 작동합니다.
답변
csh를 사용하는 경우 :
if ($?prompt)
... interactive stuff ...
그리고 그것이 bash라면 :
if [[ $- == *i* ]]; then
... interactive stuff ...
fi
또는 대안으로 bash 정규 표현식을 사용하십시오.
if [[ $- =~ i ]]; then
... interactive stuff ...
fi
이 줄은 다시 출력하거나 반향하는 줄 앞에 있어야합니다.
답변
Mike의 솔루션도 저에게 효과적이었습니다. 그러나 기본 쉘은 TCSH이므로 다음과 같이 수정 사항을 약간 편집해야했습니다 (. tcshrc에서).
if ( $?SSH_TTY ) then
exec /bin/bash
endif
모든 사람의 이익을 위해 나누겠다고 생각했습니다.
답변
나는 여기에 언급 된 다른 솔루션 중 일부를 더 좋아하지만, 누군가가 정보를 도움이되는 경우를 대비하여 시작 스크립트의 에코 명령으로 인해 SFTP 연결 끊기를 방지하기 위해 현재 bash 및 csh VM에서 사용하는 솔루션을 버리고 있다고 생각했습니다. .
BASH에서 :
if [ $TERM == "xterm" ] || [ $TERM == "xterm-256color" ]; then
echo "Xterm display identified: echo enabled"
echo_disable="0"
else
echo_disable="1"
fi
# Use the following for all subsequent echo commands
if [ $echo_disable == 0 ]; then
echo "Safe to display on Xterm"
fi
csh에서 :
if ($TERM == "xterm") then
echo "Xterm display identified: echo enabled"
set echo_disable = "0"
else
set echo_disable = "1"
endif
# Use the following for all subsequent echo commands
if !( "$echo_disable" ) echo "Safe to display on Xterm"
그것은 약간의 무차별적인 힘이지만 작동합니다.
답변
내 (기본) .bashrc
파일 의 첫 줄은 다음과 같습니다 .
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
대화식 세션을 확인하면 SCP, SFTP 또는 ssh remote-host command
모드가 엉망이되지 않습니다.
파일의 경우이없이, .bashrc
사용 echo
또는 다른 물건을 표준 출력에 인쇄, 당신은 오류의 종류를 얻을 수 있습니다 :
- SFTP :
Received message too long 168435779
- SCP :
protocol error: unexpected <newline>