根目录只能是root用户或是root用户组
r是4,w是2,x是1
根目录下除了root用户其他用户最高权限755(否则会无法连接sftp)
当为[ d ]则是目录
当为[ - ]则是文件;
若是[ l ]则表示为链接文档(link file);
若是[ b ]则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
若是[ c ]则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
查看用户:cut -d : -f 1 /etc/passwd
cat /etc/passwd
创建一个新用户 useradd user1
删除user1这个用户:userdel -r user1
查看用户组:cut -d : -f 1 /etc/group
cat /etc/group
创建一个新用户组 groupadd group_name
删除一个用户组 groupdel group_name
passwd 修改口令
passwd user1 修改一个用户的口令 (只允许root执行)
1、常用创建sftp用户
1、创建 sftp 用户组
groupadd sftp
1.1、创建用户mysftp (开始)
-s Shell文件 指定用户的登录Shell
-G 加入 sftp 用户组
-M:不要自动建立用户的登入目录。
useradd -s /sbin/nologin -M mysftp
useradd -s /sbin/nologin -M mysftp2
1.2、设置用户密码
passwd mysftp
passwd mysftp2
2、修改配置文件sshd_config
使用vim编辑/etc/ssh/sshd_config:
注释掉下面这一行:
#Subsystem sftp /usr/libexec/openssh/sftp-server
启用internal-sftp添加
Subsystem sftp internal-sftp #这行指定使用sftp服务使用系统自带的internal-sftp
在sshd_config最后加入下面这几行:限制用户mysftp,mysftp2访问的根目录
AllowTcpForwarding no
X11Forwarding no
Match User mysftp #这行用来匹配用户
ChrootDirectory /home/sftp #用chroot将用户的根目录指定到/home/sftp ,这样用户就只能在/home/sftp下活动
ForceCommand internal-sftp #指定sftp命令
Match User mysftp2
ChrootDirectory /home/sftp
ForceCommand internal-sftp
3、重启SSH服务(结束)
systemctl restart sshd
#关闭SElinux:
vi /etc/sysconfig/selinux
#找到如下这行
SELINUX=enforcing
#修改为
SELINUX=disabled
4、mysftp2 用户访问sftp
sftp mysftp2@IP
2、其他案例:创建sftp用户,但是需要读取user1下的文件 (默认不创建home目录)
前提:创建sftp用户,但是需要读取user1 /var/opt/ntp 和/var/opt/ntp2下的文件
user1:user1group /var/opt/ntp
user1:user1group /var/opt/ntp2
1、sudo useradd -s /sbin/nologin -M leosftp1
2、passwd leosftp1 # leojiang@123
3、编辑 /etc/ssh/sshd_config 文件
注释掉下面这一行:
#Subsystem sftp /usr/libexec/openssh/sftp-server
启用internal-sftp添加
Subsystem sftp internal-sftp #这行指定使用sftp服务使用系统自带的internal-sftp
Match User leosftp1
ChrootDirectory /var/opt_sftp
ForceCommand internal-sftp
AllowTCPForwarding no
X11Forwarding no
PermitTunnel no
AllowAgentForwarding no
PermitOpen none
4、mount
# mount --bind 源目录(实际存放文件的目录) 目标目录(临时创建的空目录)
sudo mount --bind /var/opt/ntp /var/opt_sftp/ntp
sudo mount --bind /var/opt/ntp2 /var/opt_sftp/ntp2
# 检查有哪些目录mount了
mount | grep /var/opt_sftp/
# 解除绑定 (不会删除源目录的文件)
#umount /var/opt_sftp/ntp
#umount /var/opt_sftp/nt2
5、为 /var/opt/ntp 和 /var/opt/ntp2 目录设置get 文件的权限
chmod 755 /var/opt_sftp/ntp
# 或读写执行权限
chmod 775 /var/opt_sftp/ntp2
# 按照组指定也可以,下面执行完权限是drwxrwsr-x+
#sudo setfacl -R -m u:leosftp1:rwx /var/opt/ntp
#setfacl: 设置文件访问控制列表 (ACL)。
#-R: 递归地应用权限修改,包括目录下的所有文件和子目录。
#-m: 添加指定的权限。
#u:user1: 对用户 user1 应用权限设置。
#rwx: 赋予读、写和执行权限。
6、把创建的leosftp1 sftp用户添加到,user1 组中
# usermod -a -G groupname username
usermod -a -G user1 leosftp1
6、重新加载 SSH 服务
systemctl reload sshd
如果连接sftp的server想要sftp免密登录:
# 如果想使用这个sftp的ip免密登录本机的sftp,
# 需要把remote-server-ip 的~/.ssh/id_rsa.pub 放到sftp服务器的sftp用户下的authorized_keys中即可
# 如果没有homemul可以手动创建即可,不用chown 修改权限
mkdir -p /home/leosftp1/.ssh
touch /home/leosftp1/.ssh/authorized_keys
#cp ~/.ssh/id_rsa.pub(remote-server-ip) 到 ~/.ssh/authorized_keys(sftp服务器的sftp用户下)
相关命令:
1、添加用户附加到组,应该用 加上 -a 选项防止离开其他用户组,仅仅做为 这个用户组 groupA 的成员。
加 -d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
[root@master sftp]# usermod -a -G groupname username
2、查看下用户组
[root@master sftp]# cat /etc/group
root:x:0:
.
.
.
mysftp:x:1000:
mysftp2:x:1001:mysftp
3、权限设置
修改文件夹 拥有者
[root@master sftp]# chown -R mysftp2:mysftp /home/sftp/user1
查看下修改后的状态user1 user2是创建的文件夹
[root@master sftp]# ll
total 8
drwxr-xr-x 2 mysftp2 mysftp 4096 Jul 24 13:43 user1
drwxr-xr-x 2 root root 4096 Jul 24 13:43 user2
4、修改文件权限
[root@master sftp]# chmod -R 544 /home/sftp/user1
查看下修改后的状态
[root@master sftp]# ll
total 8
dr-xr--r-- 2 mysftp2 mysftp 4096 Jul 24 13:43 user1
drwxr-xr-x 2 root root 4096 Jul 24 13:43 user2
5、mysftp2 用户访问sftp
sftp mysftp2@IP
输入当时设置的密码即可访问
-c comment 指定一段注释性描述。备注文字保存在passwd的备注栏中。
-d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
-g 用户组 指定用户所属的用户组。
-G 用户组,用户组 指定用户所属的附加组。
-s Shell文件 指定用户的登录Shell。
-u 用户号 指定用户的用户ID号,如果同时有-o选项,则可以重复使用其他用户的标识号。
-D:变更预设值。
-e:指定账号的有效期限,缺省表示永久有效。
-f:指定在密码过期后多少天即关闭该账号。
-m:自动建立用户的登入目录。
-M:不要自动建立用户的登入目录。
-n:取消建立以用户名称为名的群组。
-r:建立系统账号。
常见问题:
1、
[root@LXCL-Cache home]# sftp btadmin@localhost
btadmin@localhost's password:
packet_write_wait: Connection to ::1 port 22: Broken pipe
Couldn't read packet: Connection reset by peer
解决办法1
使用vim编辑/etc/ssh/sshd_config:
Subsystem sftp internal-sftp
UsePAM yes
Match user sftpuser1
ForceCommand internal-sftp
ChrootDirectory /data/wwwroot/user1/
UseDNS no
AddressFamily inet
PermitRootLogin yes
SyslogFacility AUTHPRIV
PasswordAuthentication yes
修改位置
UseDNS no
AddressFamily inet
PermitRootLogin yes
SyslogFacility AUTHPRIV
PasswordAuthentication yes
Subsystem sftp internal-sftp
UsePAM yes
Match user sftpuser1
ForceCommand internal-sftp
ChrootDirectory /data/wwwroot/user1/
重启SSH服务:
systemctl restart sshd
登录:
sftp mysftp2@IP
2、还有可能是其他的原因
[root@LXCL-Cache home]# sftp btadmin@localhost
btadmin@localhost's password:
packet_write_wait: Connection to ::1 port 22: Broken pipe
Couldn't read packet: Connection reset by peer
ChrootDirectory的权限问题,你设定的目录必须是root用户所有,否则就会出现问题。所以请确保sftp用户根目录的所有人是root, 权限是 750 或者 755
- 目录开始一直往上到系统根目录为止的目录拥有者都只能是 root,用户组可以不是 root。
- 目录开始一直往上到系统根目录为止都不可以具有群组写入权限
3、如果没有导入导出权限,需要在sftp的下一层创建文件夹并给与权限即可,如果直接给关联的目录权限可能导致sftp无法使用
如果关联的sftp目录为
drwxr-xr-x 3 root mysftp /home/testfile
如果想要有导入导出权限可以在下一层给权限eg:
drwxr-xr-x 2 mysftp2 mysftp2 /home/testfile/sftp_testfile
4、如果无法免密
SELinux:如果 SELinux 开启,可能会阻止公钥认证。临时关闭 SELinux 以测试
# 立即生效
setenforce 0
# 永久生效
vi /etc/selinux/config
SELINUX=disabled
# 检查状态
sestatus