配置思路是:
修改上传文件及目录的所有者为一个系统用户;
在FTP目录权限中不允许其他用户删除目录、文件、以及递归删除。
配置文件:/etc/vsftpd/vsftpdconf
配置项:
anonymous_enable=YES // 启用匿名
local_enable=NO // 禁用本地登录
anon_upload_enable=YES // 允许上传
anon_mkdir_write_enable=YES // 允许新建目录
chown_uploads=YES // 修改上传
chown_username=<自定义用户> // 将上传目录及文件所有者修改为一个自定义的系统用户
anon_root=<FTP的根目录> // 定义上传路径
chmod 0644 <FTP的根目录> // 修改上传路径的权限为其他用户只读
日常工作中需要大量、频繁地使用ssh到服务器查看、拉取相关的信息或者对服务器进行变更。目前公司大量使用的shell,但是随着逻辑的复杂化、脚本管理的精细化,shell已经不满足日常需求,于是我尝试整合工作中的需求,制作适合的工具。 由于管理制度的缺陷,我以工作流程为核心思考适合自己的运维方式,提升工作效率,把时间留给更有价值的事情。 完整代码在最后,请大家参考。
生产:4000+物理服务器,近 3000 台虚拟机。
开发环境:python36、redhat79,除了paramiko为第三方模块需要自己安装,其他的直接import即可。
批量执行 *** 作是一把双刃剑。批量执行 *** 作可以提升工作效率,但是随之而来的风险不可忽略。
风险案例如下:
挂载很多数据盘,通常先格式化硬盘,再挂载数据盘,最后再写入将开机挂载信息写入/etc/fstab文件。在批量lsblk检查硬盘信息的时候发现有的系统盘在/sda有的在/sdm,如果不事先检查机器相关配置是否一致直接按照工作经验去执行批量 *** 作,会很容易造成个人难以承受的灾难。
在执行批量 *** 作时按照惯例:格式化硬盘->挂载->开机挂载的顺序去执行,假设有的机器因为某些故障导致格式化硬盘没法正确执行。在处理这类问题的时候通常会先提取出失败的ip,并再按照惯例执行 *** 作。运维人员会很容易忽略开机挂载的信息已经写过了,导致复写(这都是血和泪的教训)。
所以,为了避免故障,提升工作效率,我认为应当建立团队在工作上的共识,应当遵守以下原则:
当然,代码的规范也应当重视起来,不仅是为了便于审计,同时也需要便于溯源。我认为应当注意以下几点:
1、ssh no existing session,sftp超时时间设置:
在代码无错的情况下大量ip出现No existing session,排查后定位在代码的写法上,下面是一个正确的示例。由于最开始没考虑到ssh连接的几种情况导致了重写好几遍。另外sftp的实例貌似不能直接设置连接超时时间,所以我采用了先建立ssh连接再打开sftp的方法。
2、sftp中的get()和put()方法仅能传文件,不支持直接传目录:
不能直接传目录,那换个思路,遍历路径中的目录和文件,先创建目录再传文件就能达到一样的效果了。在paramiko的sftp中sftplistdir_attr()方法可以获取远程路径中的文件、目录信息。那么我们可以写一个递归来遍历远程路径中的所有文件和目录(传入一个列表是为了接收递归返回的值)。
python自带的os模块中的oswalk()方法可以遍历到本地路径中的目录和文件。
3、多线程多个ip使用sftpget()方法时无法并发。
改成多进程即可。
4、多个ip需要执行相同命令或不同的命令。
由于是日常使用的场景不会很复杂,所以借鉴了ansible的playbook,读取提前准备好的配置文件即可,然后再整合到之前定义的ssh函数中。
同时,我们还衍生出一个需求,既然都要读取配置,那同样也可以提前把ip地址准备在文件里。正好也能读取我们返回的执行程序的结果。
参数说明:
密码认证:
公钥认证:
可以配合 grep,awk 等命令精准过滤。
个人认为 Python 在初中级运维工作中的性质更像是工具,以提升工作效率、减少管理成本为主。可以从当前繁琐的工作中解脱出来,去 探索 更有价值的事情。python 本质上并不会减少故障的产生,所以在不同的阶段合理利用自身掌握的知识解决当前最重要的痛点,千万不要本末倒置。
众所周知SFTP账号是基于SSH账号的,所以在默认情况下访问服务器的权限是非常大的,今天的教程就是教大家进行SFTP用户权限设置。\x0d\必要条件:你的openssh-server版本至少得失48p1, 因为配置权限需要版本添加的新配置项ChrootDirectory来完成。\x0d\?大家可以尝试以下命令:$ ssh -V具体实施步骤:1\x0d\我们需要创建一个用户组,专门用于sftp用户\x0d\$ groupadd sftpusers2\x0d\我们创建一个用户test\x0d\$ useradd -s /bin/false -G sftpuser test\x0d\注意这里我们将test用户的shell设置为/bin/false使他没有登陆shell的权限3\x0d\编辑 /etc/ssh/sshd_config\x0d\找到Subsystem这个配置项,将其修改为\x0d\Subsystem sftp internal-sftp\x0d\然后再到文件最尾处增加配置设定属于用户组sftpusers的用户都只能访问他们自己的home文件夹\x0d\Match Group sftpusers\x0d\ChrootDirectory %h\x0d\ForceCommand internal-sftp\x0d\AllowTcpForwarding no\x0d\保存并关闭文件4\x0d\修改test用户home文件夹的权限,让其属于root用户\x0d\chown root ~test5\x0d\重启sshd服务\x0d\$ service sshd restart6\x0d\测试用户账号$ sshtest@localhost\x0d\连接会被拒绝或者无法登陆$ sftptesst@localhost\x0d\登陆后你会发现你的账号无法切换到除自己home目录之外的地方的常见问题:如果你链接服务器的时候出现下面的提示:\x0d\Write failed: Broken pipe\x0d\这个问题的原因是ChrootDirectory的权限问题,你设定的目录必须是root用户所有,否则就会出现问题。所以请确保sftp用户根目录的所有人是root, 权限是 750 或者 755。
通常是下面这样的流程:使用 FTP/SFTP 连接到远程服务器 -> 下载要修改的文件 -> 使用 ST2 修改文件 -> 保存然后拖进 FTP 中 -> 刷新网站。
很明显这样的工作流程效率很低,特别是你修改一句代码的时候,为了即时生效,也需要重复切换几个窗口重复这个过程。于是就有了 SFTP 这个插件。
它主要功能就是通过 FTP/SFTP 连接远程服务器并获取文件列表,可以选择下载编辑、重命名、删除等等 *** 作,点下载编辑之后,可以打开这个文件进行修改。修改完成之后,保存一下会自动上传到远程的服务器上面。
使用这个插件之后,工作流程就变成了:使用 SFTP 插件打开文件 -> 使用 ST2 编辑修改文件 -> 保存文件 -> 刷新页面。效率提升了至少一倍以上
配置完之后,不知道有没有人跟我一样,会疑惑怎么继续在本地检出完整的项目进行编辑,又能通过sftp传送到其他目的地。
如下,现在我的电脑上某一个文件夹下有gcwork、phaapp、phaplus
三个项目,例如我想要把gcwork通过sftp映射过去(图中我选择的是phaapp项目,因为之前我已经把gcwork配置过了)
点开看到的
“map
to
Remote”
会看到如下文件:
图中红色框圈起来的是需要你手动配置的栏目;一共五项,需要把本来注释的
password
和
port
打开,下面把我的配置给大家看一下:
"host":
"1921688149",
"user":
"root",
"password":
"haohaoxuexi",
"port":
"2828",
"remote_path":
"/data/cap/V3/gcwork/",
//需要映射的目标目录
编辑完后保存,就会发现在你的栏目下面出现了一个
sftp-configjson
文件,最好是要出现在你的项目的根目录下啊,这样就可以把整个项目映射到目标目录里了,而不是单个的文件夹或者文件,这在接下来的同步过程中是很有用的~
如图:
当你在自己的机器上编辑完文件之后,保存过后,需要同步到目标目录,那么可以在当前编辑的文件里右击空白处,出现如下可 *** 作项,根据需要自己选择
以上就是关于centos 系统中 SFTP想要设置成只允许上传文件,不允许删除文件,如何实现全部的内容,包括:centos 系统中 SFTP想要设置成只允许上传文件,不允许删除文件,如何实现、纯干货!python 在运维中的应用 (一):批量 ssh/sftp、出现sshd fatal:Write failed:Broken pipe是什么错误等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)