linu远程登录ssh

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处开始出现的替换
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值