linux系统的常用命令
1. python实现远程登录的方法
密码登录
使用paramiko模块,适用于linux和Windows,可以实现远程登录。先安装该模块:pip install paramiko
下面直接上使用的代码:
import paramiko
cmd = 'xxxxxxxxxxxxxxxxxxxxxx'
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=hostname, port=22, username='root', password=password,timeout=7)
ssh.exec_command(cmd)
stdin, stdout, stderr = ssh.exec_command('cd /etc;mkdir mywork')
result = stdout.read(), stderr.read()
for m in result:
print(m)
return stdin,stdout,stderr
ssh.close()
备注:如果要cd到某个目录下命令,必须按照ssh.exec_command('cd /service;mkdir mywork')
这种格式写,否则下命令失败。
免密登录
首次按生成秘钥: ~/.ssh里生成了id_rsa和id_rsa.pub两个文件。
ssh-keygen -t rsa -f /home/test/sshkey -q -N "" 生成到指定目录
ssh-keygen -t rsa #生成到默认目录/.ssh
ssh-copy-id -i ~/.ssh/id_rsa.pub root@111.111.111.111 #上传公钥到远端
秘钥上传完成之后,就可以开始撸代码了:
import paramiko
private_key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa')
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=hostname, port=22, username='root', password=password,timeout=7)
stdin, stdout, stderr = ssh.exec_command(cmd)
result = stdout.read(), stderr.read()
for m in result:
print(m)
return stdin,stdout,stderr
ssh.close()
2. ssh实现远程登录的方法
ssh登录,一般是从一台linux远程连接到另一台主机:ssh root@111.11.111.111 这种方法。需要用到 pxpect
这个模块,只适合用于linux之间。先安装: pip install pexpect
上代码(用于连接远端主机):
def ssh_connect(ip, user, passwd):
child = pexpect.spawn('ssh %s@%s' % (user, ip))
i = child.expect(['password: ', '(yes/no)?',pexpect.TIMEOUT])
if i == 1:
child.sendline('yes')
child.expect('password:')
child.sendline(passwd)
elif i == 0:
child.sendline(passwd)
elif i == 2:
print('[-]Error Connecting')
return
return child
在pexpect模块中还有两个命令行是比较重要的,before()和interact()
- interact()—将控制权交给用户
interact(self, escape_character = chr(29), input_filter = None, output_filter = None)
通常一个 python 主程序通过 pexpect.spawn 启动一个子程序,该子程序启动后,python 主程序就可以通过 child.expect 和 child.send/child.sendline 来和子程序通话,python 主程序运行结束后,子程序也结束。也就是说, python 主程序启动一个 ssh 子程序,在ssh上进行完一系列的命令操作后,python 主程序运行结束,该 ssh session也会自动退出。但是如果调用 child.interact,那么该子程序就可以在运行到 child.interact 时,将子程序的控制权交给了终端用户,用户可以通过键盘的输入来和子程序进行命令交互,,用户的键盘输入 stdin 会被传给子程序,而且子程序的 stdout 和 stderr 输出也会被打印出来到终端。默认 ctrl + ] 退出 interact() 模式,把子程序的执行权重新交给 python 主程序。参数 escape_character 指定了交互模式的退出字符。
比如,在两台主机间SCP文件的时候,就需要用到interact的交互模式,否则会在提示输入密码时报错,因为主程序已经结束了。撸上我的代码:因为需求问题,我的登录远端和SCP文件是在两个函数里面的,必须这么写才可以。
def scp_dir(child,passwd):
scp_cmd = 'scp myfile root@111.111.111.111:/myfile'
child.sendline(scp_cmd)
ret = child.expect(['(yes/no)?','password: ', pexpect.TIMEOUT])
if ret == 0:
child.sendline('yes')
child.expect('password:')
child.sendline(passwd)
elif ret == 1:
child.sendline(passwd)
elif ret ==2:
print('[-]Error Connecting')
return
print(child.before)
return child.interact()
- cwd - 指定命令执行的目录
cwd 用来指定发送的命令在哪个路径下执行,它一般用在 send() 系列命令中。在 Linux 中,在 /etc 目录下执行 ls –l 命令,可以用 sendline("cd /etc && ls -l")
的方式,或者 sendline("ls –l", cwd="/etc")
。
- expect() - 关键字匹配
当 spawn() 启动了一个程序并返回程序控制句柄后,就可以用 expect() 方法来等待指定的关键字了。它最后会返回 0 表示匹配到了所需的关键字,如果后面的匹配关键字是一个列表的话,就会返回一个数字表示匹配到了列表中第几个关键字,从 0 开始计算。
3. 打包,解压,复制文件到远端主机
在A主机打包: tar -cvf myfile.tar file1 file2 file3
在A主机打包后,复制到B机并解包:tar -cf - /tmp/test | ssh B'IP "cd /tmp; tar -xf -"
在A机打包,并将打包好的文件复制到B机:
tar -cf - /tmp/test | ssh B'IP "cd /tmp; cat - > test.tar"
tar -cf - /tmp/test | scp - B'USER@B'IP:/tmp
将A机的打包文件,复制到B机并解包: zcat test.tar | ssh B'IP "cd /tmp; tar -xf -"
在B主机单独解压来自A主机的文件: tar xvf myfile.tar
4. vi编辑格式下的命令
- 保存
:w—— 将缓冲区写入文件,即保存修改
:wq—— 保存修改并退出
:x—— 保存修改并退出
:q—— 退出,如果对缓冲区进行过修改,则会提示
:q!—— 强制退出,放弃修改 - 模式:
正常模式(按Esc或Ctrl+[进入) 左下角显示文件名或为空
插入模式(按i
键进入) 左下角显示–INSERT– (编辑完之后,esc键退出该模式) - 删除
dd : 删除单行
ndw 或 ndW : 删除光标处开始及其后的n-1个字
do : 删至行首
d$ : 删至行尾
ndd : 删除当前行及其后n-1行
x 或 X : 删除一个字符,x删除光标后的,而X删除光标前的
Ctrl+u : 删除输入方式下所输入的文本
n1,n2 d : 将n1行到n2行之间的内容删除
%d : 删除全部内容
1,$d : 删除全部内容
5. sed和awk的使用
在python中,可以使用sed或者awk来实现,在不通过VI打开文件时,对文件内容进行编辑,主要用于自动化脚本的实现。
- 删除指定行,命令格式为:
sed –i ‘/指定行开头/,/指定行结尾/d’ 文件名
或者sed -i -e '/aa/d' -e'/bbb/d' test
sed ‘/^$/d’ file
#移除空白行,空白行用"^$"匹配
sed ‘/jcdd/’d file
#删除包含jcdd的行
sed 2,$d’ file
#删除第二行到尾行之间的所有行
- 替换关键字,命令格式为:
sed 's/book/books/' file
#将文件中每一行的book替换为books,并保存跟新该文件
sed ‘s/jcdd/ganji/g’ file
#g标志在整行范围内把jcdd都替换为ganji。如果没有g标记,则只有每行第一个匹配的jcdd被替换成ganji。g换出Ng代表第N处开始出现的替换