我最近设置了一个相当小的 Debian 服务器(fail2ban
并且ufw
安装了启用的 OpenSSH 配置文件),使用具有默认 shell 的用户/bin/bash
:
$ grep "$(whoami)" /etc/passwd
nightfirecat:x:1000:1000::/home/nightfirecat:/bin/bash
当我scp file server.ip
从我的机器运行时,我得到以下输出:
$ scp file server.ip
lost connection
但是,当我将服务器上的默认 shell 更改为/bin/sh
viasudo usermod --shell /bin/sh nightfirecat
或 时sudo chsh -s /bin/sh nightfirecat
,scp
命令会成功。
$ scp file server.ip
file 100% 16KB 314.8KB/s 00:00
运行 ssh 命令时会观察到相同的行为:(使用 ssh 进行远程连接,无论使用哪种 shell 都可以)
$ ssh server.ip 'echo foo' # /bin/bash shell
$ ssh server.ip 'echo foo' # /bin/sh shell
foo
我的/var/log/auth.log
日志似乎没有显示任何身份验证问题,而 scp 的调试日志也没有说明问题。我确实有一个.bashrc
在登录时运行的文件,但它的第一个命令是[ -z "$PS1" ] && exit
在非交互式登录时退出。
答案1
事实上问题出在我的.bashrc
文件上。该文件的开头之前是这样写的:
# If not running interactively, don't do anything
[ -z "$PS1" ] && exit
问题在于exit
退出 shell。改用return
以下方法可达到预期效果:
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
PS 致谢https://superuser.com/a/1184787/460089该解决方案。