跳转至

终端

  • 图形终端
  • 字符终端
  • 远程终端:SSH、VNC
  • 代码终端:Fabric

Linux默认提供了七个终端(六个命令行界面以及一个图形界面,可以使用Alt+F1/.../7来切换),每个终端可以登录不同用户,每个用户每次登录后获取shell的PID都是不同的,据此可以进行一些个性化设置(~/.bashrc),由于CPU每秒可以在不同进程之间快速切换,所以多人同时使用系统时是无感知的

如果某个终端因某个进程卡死导致界面不能动,可以切换到另一个终端,用ps -aux找出有问题的进程然后kill掉,再切回刚才的终端就又恢复了正常。

命令行

# [用户名@主机名 所在目录]提示字符 命令/可执行文件 选项 参数
[root@localhost ~]$ command [--options] parameter1 parameter2
"""
系统管理员和普通用户的提示字符分别为:`#` 和 `$`  
选项名前通常用`-` 和 `--`表示简写和全写,也会有带+的情况  
指令间用至少一个空格来分隔,大小写敏感  
回车执行命令,`\`可将回车转义为换行输入  
执行多条命令,用分号隔开
"""

快捷键

  • Tab 命令及选项补全/提示
  • Ctrl+c 中断目前程序
  • Ctrl+d 键盘输入结束EOF(End Of Input)
  • Shift+Page Up/Down 向前/后翻看输出信息,clear后则翻不出来
# 查看默认shell
ls -l /bin/sh
"""
/bin/sh -> dash
ubuntu默认shell是dash,性能高,但会导致一些bash命令失败
"""
# 切换成bash
sudo dpkg-reconfigure dash
"""
输入完密码,会弹出询问界面,问是否让dash为默认shell,选择否,将会删除dash,默认回到bash
"""

用户操作

  • 切换用户
# 将身份切换为其他用户
su - [username]  # 非root用户切换时需要输入对方密码,使用exit可以退回原来的用户
"""
不加username默认切换到root用户
带 - 表示完全切换,即当前路径切换为对方家目录,否则还会留在当前用户的家目录
"""

# 以其他用户的身份执行命令
sudo [-u username] command
"""
需要其它用户授权给你,才可以使用sudo
    可以用visudo命令(vi只有读取权限)编辑/etc/sudoers文件,给用户添加一行与root相同的权限即可

不带usernamem默认切换root用户
加-s可以保持session
"""

用户相关的很多操作都需要root用户权限

groupadd group1  # 创建用户组
groupdel group1  # 删除用户组

# 创建用户
useradd [-g group_name] username
"""
-g 指定用户组,否则默认会创建并指定一个与用户同名的用户组
-m 强制建立家目录(一般默认)
-s 指定默认shell
"""

# 删除用户
userdel [-r] username
"""
防止误删,删除后用户的家目录还会保留在/home中
    -r 连同家目录一起删除
"""

# 修改用户信息
usermod username
"""
usermod -g group_new username  修改用户组
usermod -d /home/new_path username  修改家目录存放位置
usermod -s /bin/bash username  修改默认shell
"""

# 设置/修改密码
passwd [username]
"""
密码为空则不需要密码即可登录
root用户可以修改任意用户的密码且不需要输入旧密码
不加username则默认修改当前用户的密码
"""

每个登录的用户都会获得两个ID:UID(User ID) 和 GID(Group ID),root的ID都是0

# 查看某个用户的账号信息,不带用户名默认查看自己
# 用户不存在则返回no such user,可以用来判断用户是否存在
id [username]
# 查看所属用户组
groups
# 查看当前在线用户
who  # 或者 w

用户配置文件

  • /etc/passwd

账号信息存储在/etc/passwd文件中,其中很多都是系统账号(系统运行所必须的),不可随意删除

其中/usr/sbin/nologin表示不允许登陆

密码为x,表示需要密码,如果为空表示不需要密码

20210827231927

  • /etc/shadow

早期密码存在/etc/passwd中,但后来因为安全原因单独存到了:/etc/shadow

20210827233831

最近修改日期:是从1(1970.1.1)开始累计的,多少天内不可修改或需要修改,为0则表示可任意修改,99999为273年,即不限制

usermod -chage username  # 修改失效日期,如果想暂停某个用户登录,可以将失效日期改为0
  • /etc/group

用户组配置文件

给用户发消息

write username  # 给某个在线用户发送消息
wall  # 给所有在线用户发送消息
mesg n/y  # 拒绝或允许接收消息,root用户默认拒绝,普通用户无法拒绝root用户发来的消息
mail -s "test content" [chonge@localhost]  # 发送邮件,也可以给离线用户发,给本机用户可以省略[chonge@localhost],对方可以使用mail命令来接收查看邮件内容

20210828001620

20210828001628

wget 下载

Linux下一种类似与迅雷的下载软件,通过HTTP、HTTPS、FTP三个最常见的TCP/IP协议下载

wget -c xxx
"""
-c 支持断点续传
"""

SSH

https://wangdoc.com/ssh/

最早的远程命令行服务是telnet,但它是明文传输,于是改用了更安全的SSH(Secure Shell)

在Linux/Unix 系统的位置是:/usr/local/bin/ssh
在Windows系统的位置是:\Program Files\OpenSSH\bin\ssh.exe

  • /etc/ssh/ssh_config 客户端的全局配置文件
  • ~/.ssh/config 用户个人配置文件,优先级高于全局配置文件
  • ~/.ssh/id_rsa 用于SSH协议版本2的RSA私钥
  • ~/.ssh/id_rsa.pub 用于SSH协议版本2的RSA公钥
  • ~/.ssh/known_hosts 包含SSH服务器的公钥指纹
# ~/.ssh/config
# 服务器1
Host 别名
    HostName IP地址
    Port 22
    User 用户名
    IdentityFile 私钥地址   # 缺省值为~/.ssh/id_rsa
# 服务器2
Host test
    HostName remote.example.com
    Port 7777
    User demo

以上配置完后使用ssh test登陆,等同于:ssh -p 7777 demo@remote.example.com

  • 免密
# 生成公钥:id_rsa.pub
ssh-keygen -t rsa
# 将公钥文件传输到服务器
scp -P 28036 -p id_rsa.pub root@ip:~/.ssh/
"""
-P 指定端口
-p 保留原文件的修改时间,访问时间和访问权限
"""

# 登陆服务器
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
  • 密钥登陆

ssh -i 密钥.pem root@ip

Fabric

版本

  • Fabric1:旧版本,只支持Python2
  • Fabric2:官方版本同时支持Python2和3
  • Fabric3:非官方支持Python2和3版本
import paramiko
import os


class RunShell():
    def __init__(self):
        self.__host = "xxx.xxx.xx.xx"
        self.__port = 22
        self.__username = "root"
        self.__password = "xxxx"

    # 基于用户名和密码的sshclient方式登陆
    def ssh(self, cmd):
        ssh = paramiko.SSHClient()
        # 允许连接不在know_host文件中的主机,此方法必须放在connect方法的前面
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        # 建立连接
        ssh.connect(hostname=self.__host, port=self.__port, username=self.__username, password=self.__password)
        # 使用这个连接执行命令,结果放到stdout中,如果有错误将放到stderr中
        stdin, stdout, stderr = ssh.exec_command(cmd)
        result = stdout.read().decode("utf-8")

        # 关闭连接
        ssh.close()

        return result

    # 上传或下载文件
    def sftp(self, up_or_down, localpath, remotepath):
        # 实例化一个trans对象
        trans = paramiko.Transport((self.__host, self.__port))
        # 建立连接
        trans.connect(username=self.__username, password=self.__password)
        # 实例化一个sftp对象,指定连接的通道
        sftp = paramiko.SFTPClient.from_transport(trans)

        result = "未执行"
        if up_or_down == "up":
            if not os.path.exists(localpath):
                result = "未找到要上传的文件"
            else:
                # 上传文件
                sftp.put(localpath=localpath, remotepath=remotepath)
                self.ssh("systemctl reload nginx")
                result = "上传成功,并已重启服务器"
        elif up_or_down == "down":
            if remotepath == "":
                result = "没有找到服务器中相应的路径"
            else:
                # 下载文件
                sftp.get(remotepath=remotepath, localpath=localpath)
                result = "下载成功"
        else:
            result = "不知道该上传还是下载"

        trans.close()

        return result

最后更新: 2022-07-13