2023年5月

前言

上一篇中已经预告,我们这篇主要说一说
Linux中用户相关
的命令。
可能各位小伙伴用的Windows会比较多一点,在Windows操作系统中,我们知道有Administrator用户,Administrator 是Windows系统中的管理员用户,有着最高的权限。
用户登录Administrator后可以创建Gust等用户,修改密码并且给Gust用户分配相应的权限。
同样的在Linux中,root就相当于Administrator用户,具有着最高权限。登录root 用户可以创建用户、修改用户密码、给用户分配角色等等。
下面思维导图中列出了我们需要掌握的19个命令
在这里插入图片描述

useradd 创建用户

1、简介

useradd 命令用户创建新的用户或者更改用户信息

2、原理
在这里插入图片描述

3、语法格式

useradd [参数选项] [用户名]
或
useradd -D [参数选项]

4、参数说明
① 不加选项-D参数

参数选项 参数说明
-c comment 加上
备注信息
,会保存到passwd备注栏中(第五列)
-d home_dir 新用户每次登录时使用的
家目录
-e expire_date 用户终止日期
-f inactive_days 用户过期几日后永久停权
-g initial_group 指定用户对应的用户组。用户组必须是系统现在已存在的名词
-G group,[...] 定义此用户为多个不同组的成员。每个用户组使用逗号(,)分割
-m 用户目录如不存在则自动建立
-M 不建立家目录,优先于、etc/login.defs文件设定。【创建虚拟用户时一般不需要建立家目录,部署应用服务时则需要创建虚拟用户】
-n 默认情况下用户的用户组和用户名称是相同的。通过该参数,就不会生成与用户名一样的用户组了
-s shell 用户登录后使用的
Shell名称
。默认不填写,系统会使用配置文件(/etc/default/useradd)中的预设值
-u uid 用户ID值。这个值是
唯一的

② 加-D选项参数

参数选项 参数说明
-b defalut_home 定义用户家目录的基本目录,当用户家目录不存在时,此目录将作为家目录生效
-e defalut_expire_date 用户
账号停止日期
-f defalut_inactive 用户过期几日后停权
-g defalut_group 新用户起始用户组名或ID。用户组名必须为现已存在的名称
-s default_shell 用户登录后使用
Shell名称

5、实践操作
① 不加任何参数添加用户

# 创建xiezhrspace 用户
[root@xiezhr ~]# useradd xiezhrspace
# /home/ 路径下新生成一个xiezhrspace 目录。这个就是xiezhrspace用户的家目录
[root@xiezhr ~]# ls -ld /home/xiezhrspace
drwx------ 2 xiezhrspace xiezhrspace 4096 Aug 29 23:05 /home/xiezhrspace

在前面我们说过创建一个新用户会在/etc/shadow、/etc/group 和/etc/gshsdow 文件中生成相关信息,具体是不是这样的呢?
我们去看一看(●'◡'●)

# 在创建用户时候没有指定密码,但是shadow还是生成了一行信息
[root@xiezhr ~]# grep -w xiezhrspace /etc/shadow
xiezhrspace:!!:19233:0:99999:7:::

# 创建用户时,默认会创建与用户名同名的用户组
[root@xiezhr ~]# grep -w xiezhrspace /etc/group
xiezhrspace:x:1002:

#组密码文件中也会增加一条信息
[root@xiezhr ~]# grep -w xiezhrspace /etc/gshadow
xiezhrspace:!::

② 创建一个组,并将新建用户归于这个组

# 创建一个gid 为808 的用户组
[root@xiezhr ~]# groupadd -g 808 xiezhrgroup
# 创建一个uid为908的用户xietest,并将用户归于xiezhrgroup组
[root@xiezhr ~]# useradd -g xiezhrgroup -u 908 xietest
# 查看用户信息
[root@xiezhr ~]# id xietest
uid=908(xietest) gid=808(xiezhrgroup) groups=808(xiezhrgroup)

③ -M -s参数的使用(在生产环境中
部署Nginx、MySQL等服务经常使用

# -M 不创建见目录
# -s 指定登录后的Shell
# /sbin/nologin  表示禁止登陆
[root@xiezhr ~]# useradd -M -s /sbin/nologin xiaofang
[root@xiezhr ~]# ls -ld /home/xiaofang
ls: cannot access /home/xiaofang: No such file or directory
[root@xiezhr ~]# grep -w xiaofang /etc/passwd
xiaofang:x:1003:1003::/home/xiaofang:/sbin/nologin

/etc/passwd 文件说明

xiaofang x 1003 1003 /home/xiaofang /sbin/nologin
用户名称 账号密码 账号UID 账号组GID 用户说明 用户家目录 shell解释器

usermod 修改用户信息

1、简介

usermod 命令用于修改系统已经存在的用户账号信息

2、语法格式

usermod [参数选项] [用户名]

3、参数选项

参数 参数说明
-c comment 修改用户password文件中用户的说明栏,与useradd -c 功能相同
-d home_dir 修改用户的家目录 与useradd -d 功能相同
-e expire_date 修改用户终止日期 与useradd -e 功能相同
-f inactive_days 修改用户过期后几日永久停权 与useradd -f 功能相同
-g initial_group 修改用户对应的用户组 与useradd -g 功能相同
-G group,[......] 修改此用户为多个不同组的成员 与useradd -G功能相同
-m 用户目录如果不存在则自动建立
-M 不建立用户家目录。一般创建虚拟用户时不建立家目录。不是nginx、redis等服务是需要创建虚拟用户
-n 默认情况下,用户的用户组与用户的名称相同
-s shell 修改用户登入后使用的Shell名称 与useradd -s 功能相同
-u uid 修改用户的ID值 与useradd -u 功能相同
-a 追加用户到用户组 仅与-G参数连用
-l 修改用户账号名称
-L 锁定用户密码,不让用户改密码
-U 解除密码锁定

4、实践操作
将前面创建的xiezhr 用户的用户注释修改为“测试用户”,UID 修改为888,归属修改为用户组root、xiezhr 成员,其Shell类型为/sbin/nologin,设置家目录为/home/xiezhr 用户过期时间为2022-10-02 ,过期后15天停权

[root@xiezhr ~]# usermod -u 888 -s /sbin/nologin -c "测试用户" -G root -e "2022/10/02" -f 30 -d /home/xiezhr xiezhr
[root@xiezhr ~]# grep -w xiezhr /etc/passwd
xiezhr:x:888:1001:测试用户:/home/xiezhr:/sbin/nologin
[root@xiezhr ~]# id xiezhr
uid=888(xiezhr) gid=1001(xiezhr) groups=1001(xiezhr),0(root)
[root@xiezhr ~]# grep -w xiezhr /etc/shadow
xiezhr:!!:19233:0:99999:7:30:19267:
[root@xiezhr ~]# chage -l xiezhr
Last password change                                    : Aug 29, 2022
Password expires                                        : never
Password inactive                                       : never
Account expires                                         : Oct 02, 2022
Minimum number of days between password change          : 0
Maximum number of days between password change          : 99999
Number of days of warning before password expires       : 7

userdel 删除用户

1、简介

userdel 命令用户删除指定的用户及与该用户相关的文件

2、语法格式

userdel [参属选项] [用户名]

3、参数选项

参数 参数说明
-f 强制删除用户,即使用户当前登录
-r 删除用户的同时,删除与用户相关的所有文件

4、实践操作
① 不加参数删除用户

[root@xiezhr home]# tail -4 /etc/passwd
xiezhr:x:888:1001:测试用户:/home/xiezhr:/sbin/nologin
xiezhrspace:x:1002:1002::/home/xiezhrspace:/bin/bash
xietest:x:908:808::/home/xietest:/bin/bash
xiaofang:x:1003:1003::/home/xiaofang:/sbin/nologin
[root@xiezhr home]# ll /home/xietest/ -ld
drwx------ 2 xietest xiezhrgroup 4096 Aug 29 23:16 /home/xietest/
[root@xiezhr home]# userdel xietest 
[root@xiezhr home]# grep -w xietest /etc/passwd
[root@xiezhr home]# ll /home/xietest/ -ld
drwx------ 2 908 xiezhrgroup 4096 Aug 29 23:16 /home/xietest/

② 加 -r 参数删除用户及加目录

[root@xiezhr home]# ls -ld /home/xiezhr001/
drwx------ 2 xiezhr001 xiezhr001 4096 Sep  4 19:50 /home/xiezhr001/
[root@xiezhr home]# grep -w xiezhr001 /etc/passwd
xiezhr001:x:1005:1005::/home/xiezhr001:/bin/bash
[root@xiezhr home]# userdel -r xiezhr001 
[root@xiezhr home]# grep -w xiezhr001 /etc/passwd
[root@xiezhr home]# ls -ld /home/xiezhr001/
ls: cannot access /home/xiezhr001/: No such file or directory

注意

  • 在实际工作中,尽量不要使用userdel删除用户,只需要在/etc/passwd里注释用户就可以了。
  • 在使用
    -r
    参数一定要慎重,-r参数会将家目录下所有文件和目录都删除,该过程是不可逆的

groupadd 创建新的用户组

1、简介

groupadd 用于创建新的用户组。实际工作中一般也不用,因为useradd命令在创建用户的时候也会创建一个同名的用户组

2、语法格式

groupadd [参数选项] [用户组]

3、参数选项

参数 参数说明
-g gid 指定用户组的gid,除非接-o参数,否则ID值唯一且不为负,如果不指定-g参数,则gid从500开始
-f 新增一个账户,强制覆盖一个已存在的组账号

4、实践操作
指定gid添加用户组

# 添加GID为123的test1用户组
[root@xiezhr ~]# groupadd -g 123 test
[root@xiezhr ~]# tail -l /etc/group
test:x:123:
[root@xiezhr ~]# tail -l /etc/gshadow
test:!::

groupdel 删除用户组

1、简介

groupdel 命令用户删除指定的用户组,一般不用

2、语法格式

groupdel [用户组]

3、实践操作
删除test用户组

[root@xiezhr ~]# groupdel test 
[root@xiezhr ~]# grep -w test /etc/group

passwd 修改用户密码

1、简介

passwd 命令用于修改用户密码及密码过期使劲啊等,工作中会经常用到。
普通用户和超级用户都可以运行passwd命令,普通用户只能更改自身密码,超级用户root则可以设置或修改所有用户的密码

2、语法格式

passwd [参数选项] [用户名]

3、参数选项

参数 参数说明
-k 为密码已经过期的用户更新有效期
-l 锁定用户,被锁定的用户不能登录。
仅root用户有此权限
--stdin 从标准输入读取密码字符串
-u 解除对用户的锁定,
仅root用户有此权限
-d 删除用户密码,使密码为空。
仅root用户有此权限
-e 是用户密码立即过期,将用户下次登录时强制要求用户修改密码。
仅root用户有此权限
-n 设置修改该密码的最短天数 。
仅root用户有此权限
-x 设置修改密码的最长天数。
仅root用户有此权限
-w 设置用户在密码过期前收到警告信息的天数。
仅root用户有此权限
-i 设置密码过期多少天后禁用账户。
仅root用户有此权限
-S 显示用户密码相关的简单描述。
仅root用户有此权限

4、实践操作
① 修改用户自身密码

[root@xiezhr ~]# passwd                # 修改root用户自身密码
Changing password for user root.      
New password:                          # 输入修改的密码,系统不会显示
Retype new password:                   # 再次输入密码
passwd: all authentication tokens updated successfully.       # 设置成功了

② 设置及修改普通用户密码

[root@xiezhr ~]# passwd xiezhr
Changing password for user xiezhr.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.

③ 显示账号密码信息

[root@xiezhr ~]# passwd -S xiezhr
xiezhr PS 2022-09-05 0 99999 7 30 (Password set, MD5 crypt.)

④一条命令修改密码

[root@xiezhr ~]# echo "123456"|passwd --stdin xiezhr
Changing password for user xiezhr.
passwd: all authentication tokens updated successfully.

⑤ 设置xiezhr用户7天内不能更改密码,60天以后必须修改密码,过期10天通知用户,过期30天后禁止用户登录

[root@xiezhr ~]# passwd -n 7 -x 60 -w 10 -i 30 xiezhr
Adjusting aging data for user xiezhr.
passwd: Success

chage 修改用户密码有效期

1、简介

chage 命令用于查看或修改用户密码有效期

2、语法格式

chage [参数选项] [用户名]

3 、参数选项

参数 参数说明
-d 设置上一次密码更改的日期
-E 账号过期的日期。日期格式:YYYY-MM-DD
-I 设置密码过期多少天后禁用账户
-l 显示账号有效期信息
-m 密码可更改的最小天数。默认为0,即任何时候都可以修改
-M 密码保持有效的最大天数
-W 密码到期前,提前收到警告信息天数
4、实践操作
设置xiezhr用户7天内不能更改密码,60天以后必须修改密码,过期10天通知xiezhr 用户,过期30天后禁止用户登录
[root@xiezhr ~]# chage -m 7 -M 60 -W 10 -I 30 xiezhr

批量更新用户密码

1、简介

chpasswd 命令用于从标准输入中读取一定格式的用户名、密码来批量更新用户的密码,格式为“用户名:密码“

2、语法格式

chpasswd [参数选项]

3、参数选项

参数 参数说明
-c 默认格式是明文密码,使用-e参数则需要加密的密码
4、实践操作
批量修改密码
[root@xiezhr ~]# chpasswd   # 输入chpasswd后,回车
xiezhr:123456               # 格式为用户名:密码
testxiezhr:123456           # 一行一个
	                        # 新行按Ctrl+D 结束

su 切换用户

1、简介

su 命令用户将当前用户切换到指定用户或以指定用户的身份执行命令或程序

2、语法格式

su [参数选项] [用户名]

3、参数选项

参数 参数说明
-, -l, --login 切换用户的同时,将用户的家目录/系统环境等重新按切换后的用户初始化
-c 向Shell 传递单个命令

4、实践操作
① 切换到普通用户

# 切换到testxiezhr用户,不用输入密码即可切换
[root@xiezhr ~]# su - testxiezhr

②切换到root用户

# 虽然已经切换到了root用户,但是家目录还是testxiezhr。环境变量还是testxiezhr用户的,**这种切换问题很严重**
[testxiezhr@xiezhr ~]$ su root
Password:                          # 普通用户切换到root用户需要输入密码
[root@xiezhr testxiezhr]# pwd
/home/testxiezhr
# 正确切换方式
[root@xiezhr testxiezhr]# exit
exit
[testxiezhr@xiezhr ~]$ su - root
Password:                                               # 需要输入密码
Last login: Mon Sep  5 21:13:39 CST 2022 on pts/3
[root@xiezhr ~]# pwd
/root

注意:
[x] "su 用户名" 虽然能切换到对应用户,但切换后的环境变量信息还是切换之前用户的
[√] ** ”su - 用户名“ 不但可以切换到对应用户,还能将环境变量一起切换**

visudo 编辑sudoers文件

1、简介

visudo命令是专门用来编辑 /etc/sudoers这个文件的,同时提供语法检查等功能。 /etc/sudoers文件是sudo命令的配置文件。sudo命令在下一个命令你会看到。而为什么不用vi/vim来直接编辑/etc/sudoers文件呢? 因为如果使用vim 编辑sudoer文件时没有语法校验,编辑错了会导致授权无法生效

2、语法格式

visudo [参数选项]

3、参数选项

参数 参数说明
-c 手动执行语法检查

4、实践操作
①将xiezhr用户提权为root身份,testxiezhr 用户具有添加和删除用户的权限

# 以下命令相当于 vim /etc/sudoers    进行编辑sudoers文件
[root@xiezhr ~]# visudo

#在/etc/sudoers 文件中添加如下权限
xiezhr ALL=(ALL)        ALL                                     # 此行时将xiezhr用户提权为root身份
testxiezhr ALL=(ALL)     /usr/sbin/useradd, /usr/sbin/userdel   # 授予可以以root身份添加和删除用户权限

上面操作说明

待授权的用户或组 机器=(授权角色) 可以执行的命令
testxiezhr ALL=(ALL) /usr/sbin/useradd,/usr/sbin/userdel

② 通过-c参数校验语法是否正确
通过① 我们已经对xiezhr用户和testxiezhr用户做了不同的授权,那么怎么判断授权的语法是否正确呢

[root@xiezhr ~]# visudo -c
/etc/sudoers: parsed OK
/etc/sudoers.d/90-cloud-init-users: parsed OK

直接root用户下操作不就可以了么?为什么要通过sudo授权呢?
我们希望一个用户具有root权限去干活,但是又不希望这个用户威胁系统安全。

sudo 以另一个用户身份执行命令

1、简介

sudo 命令可以让普通用户拥有超级用户的权限去执行指定的命令或程序。普通用户不需要知道root密码就可以得到授权,授权我们在上面已经说过

2、语法格式

sudo [参数选项]

3、参数选项

参数 参数说明
-l 列出当前用户可以执行的命令。只有在sudoers 文件里的用户才能使用该选项
-h 列出使用方法,并退出
-H 将环境变量中的HOME(家目录)指定为要变更身份的使用者家目录
-V 显示版本信息,并退出
-v sudo在第一次执行时,或者在N分钟内没有执行,则会询问密码,参数用于重新做一次确认
-u 以指定用户的身份执行命令
-k 清除时间戳上的实践,下次再次使用sudo时要再此输入密码
-K 与k类似,同时还删除时间戳文件
-b 在后台执行指定命令
-p 更改询问密码时的提示语
-e 不执行命令,而是修改文件,相当于sudo edit

4、sudo 工作原理
sudo工作原理

5、实践操作
创建一个testuser 用户,并对testuser进行sudo授权管理。授权完成后sudo操作

# 1、创建testuser 用户
[root@xiezhr ~]# useradd testuser
# 2、将testuser 用户密码修改为******
[root@xiezhr ~]# passwd testuser
Changing password for user testuser.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.
# 3、执行以下命令后添加 `testuser ALL=(ALL)        ALL  ` 对testuser用户进行sudo授权 参照下图
[root@xiezhr ~]# visudo
testuser ALL=(ALL)        ALL
# 4、登录testuser 用户,查看 当前用户被授予的sudo权限集合
[testuser@xiezhr ~]$ sudo -l
Matching Defaults entries for testuser on xiezhr:
    !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS",
    env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES",
    env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
    secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin

User testuser may run the following commands on xiezhr:
    (ALL) ALL

# 5、登录testuser用户,执行ls /root 发现时没有权限的
[testuser@xiezhr ~]$ ls /root
ls: cannot open directory /root: Permission denied
# 6、当加上sudo 后 再执行ls /root (第一次需要输入testuser用户密码,上面原理图介绍过),发现可以访问/root 路径了,此时testuser 具有了
[testuser@xiezhr ~]$ sudo ls /root

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for testuser: 
bdcdb84c414c2493e5856597b89be9f0.gif

6、 sudo 小结

  • 对用户进行sudo授权后,所有用户执行命令 格式为
    sudo + [命令]
  • sudo - l
    命令可以查看当前用户被授予的sudo权限集合
  • 当我们在授权用户下执行sudo时,如果需要输入密码。此时输入密码是
    当前用户的密码

id 显示用户与用户组信息

1、简介

id 命令可以显示指定用户的ID(UID)和组ID(GID)等有效信息

2、语法格式

id [参数选项] [用户名]

3、参数选项

参数 参数说明
-g 显示用户所属群组的ID
-G 显示用户所属附加群组的ID
-n 显示用户,所属群组或附加群组的名称
-r 显示实际ID
-u 显示用户ID

4、实践操作
显示用户的UID和GID

# id 后不跟用户,默认时当前登录用户
[root@xiezhr home]# id
uid=0(root) gid=0(root) groups=0(root)
# 显示指定用户信息
[root@xiezhr home]# id testxiezhr
uid=1006(testxiezhr) gid=1006(testxiezhr) groups=1006(testxiezhr)
# 显示当前登录用户名称
[root@xiezhr home]# id -gn
root
# 显示当前登录用户GID
[root@xiezhr home]# id -g
0
# 显示当前登录用户UID
[root@xiezhr home]# id -u
0

w 显示已登录用户信息

1、简介

w命令可以显示已经登录系统的用户,并显示用户正在执行的命令

2、语法格式

w [参数选项] [用户]

3、参数选项

参数 参数说明
-h 不显示前两行标题信息
-u 忽略执行程序的名称以及CPU时间信息
-s 使用短输出格式

4、实践操作
① 显示已登录用户信息

[testuser@xiezhr ~]$ w
 21:21:42 up 609 days, 7 min,  4 users,  load average: 2.66, 2.99, 3.17
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    39.130.60.62     20:33   48:22   0.02s  0.02s -bash
root     pts/1    39.130.60.62     20:55   13:10   0.07s  0.02s -bash
root     pts/2    39.130.60.62     21:04   16:54   0.02s  0.02s -bash
root     pts/3    39.130.60.62     21:21    6.00s  0.04s  0.00s w

w命令执行结果说明

  • 第一行依次显示当前的系统时间、系统从启动到现在已经运行的时间、登录到系统中的用户数和系统平均负载
列名 含义
USER 登录系统的用户
TTY 用户使用的TTY名称
FROM 用户从哪里登录进来,一般显示远程登录主机的IP地址或主机名
LOGIN@ 用户登录的日期和时间
IDLE 显示终端空闲的时间
JCPU 表示该终端上的所有进程及子进程使用系统的总时间
PCPU 当前活动进程使用的系统时间
WHAT 当前用户执行的进程名称和选项

② -h 参数

[root@xiezhr ~]# w -h
root     pts/0    39.130.60.62     20:33    1:04m  0.02s  0.02s -bash
root     pts/1    39.130.60.62     20:55   28:55   0.07s  0.02s -bash
root     pts/2    39.130.60.62     21:04   32:39   0.02s  0.02s -bash
root     pts/3    39.130.60.62     21:21   15:51   0.04s  0.02s -bash
root     pts/4    39.130.60.62     21:37    3.00s  0.02s  0.00s w -h

显示已登录用户信息

1、简介

who 命令用于显示已经登录系统的用户,以及系统的启动时间等信息

2、语法格式

who [参数选项]

3、参数选项

参数 参数说明
-a 显示所有信息
-b 显示系统启动时间
-d 显示已结束的进程
-H 显示标题,默认是不显示的
-l 显示登录进程

4、实践操作
① 不带参数显示所有信息

[root@xiezhr ~]# who
root     pts/0        2022-09-11 20:33 (39.130.60.62)
root     pts/1        2022-09-11 20:55 (39.130.60.62)
root     pts/2        2022-09-11 21:04 (39.130.60.62)
root     pts/3        2022-09-11 21:21 (39.130.60.62)
root     pts/4        2022-09-11 21:37 (39.130.60.62)
root     pts/5        2022-09-11 22:19 (39.130.60.62)

② 显示系统启动时间

[root@xiezhr ~]# who -b
         system boot  2021-01-10 21:14

③ 显示已结束的进程

[root@xiezhr ~]# who -d

④ 显示标题

[root@xiezhr ~]# who -H
NAME     LINE         TIME             COMMENT
root     pts/0        2022-09-11 20:33 (39.130.60.62)
root     pts/1        2022-09-11 20:55 (39.130.60.62)
root     pts/2        2022-09-11 21:04 (39.130.60.62)
root     pts/3        2022-09-11 21:21 (39.130.60.62)
root     pts/4        2022-09-11 21:37 (39.130.60.62)
root     pts/5        2022-09-11 22:19 (39.130.60.62)

⑤ 显示带标题的所有信息

 [root@xiezhr ~]# who -H -a
NAME       LINE         TIME             IDLE          PID COMMENT  EXIT
           system boot  2021-01-10 21:14
           run-level 3  2021-01-10 21:14
LOGIN      ttyS0        2021-01-10 21:14              1009 id=tyS0
LOGIN      tty1         2021-01-10 21:14              1008 id=tty1
root     + pts/0        2022-09-11 20:33 01:50       23396 (39.130.60.62)
root     + pts/1        2022-09-11 20:55 01:15       27638 (39.130.60.62)
root     + pts/2        2022-09-11 21:04 01:19       29660 (39.130.60.62)
root     + pts/3        2022-09-11 21:21 01:02         405 (39.130.60.62)
root     + pts/4        2022-09-11 21:37 00:46        3587 (39.130.60.62)
root     + pts/5        2022-09-11 22:19   .         11675 (39.130.60.62)

以上显示的各项含义

名称 [状态] 线路 时间 [活动] [进程标识] (主机名)

列名 说明
NAME 名称: 用户登录名
状态:表示线路对用户是否都是可写的
LINE 线路: pts/0 pts/1等等
TIME 时间:用户登录系统的时间
IDLE 活动:某用户最后一次活动到现在的时间;. 表示一分钟内线路活动
PID 进程表示:用户进程id
COMMENT 主机名

users 显示已登录用户

1、简介

users 命令用于显示已经登录的用户。一个用户登录多次则会显示多次

2、实践操作

[root@xiezhr ~]# users
root root root root root root

whoami 显示当前登录的用户

1、简介

whoami 命令用于显示当前登录的用户。是英文who am i 的简写

2、实践操作

[root@xiezhr ~]# whoami
root
[root@xiezhr ~]# su - testuser
Last login: Sun Sep 11 21:21:40 CST 2022 on pts/3
[testuser@xiezhr ~]$ whoami
testuser

last 显示用户登录列表

1、简介

last命令用于显示最近登录的用户列表

2、语法格式

last [参数选项]

3、参数选项

参数 参数说明
- num 指定显示结果的行数

4、实践操作
① 不加参数显示

[root@xiezhr ~]# last
root     pts/6        39.130.60.62     Sun Sep 11 22:42   still logged in   
root     pts/0        39.130.60.62     Sun Sep 11 22:37   still logged in 
root     pts/1        39.130.60.29     Sun Nov 29 09:09 - down   (01:02)    
root     pts/0        39.130.60.29     Sun Nov 29 08:49 - down   (01:23)    
root     pts/0        112.112.17.172   Fri Nov  6 12:50 - 15:45  (02:55)    

wtmp begins Fri Nov  6 12:50:41 2020

② -num 参数,显示指定显示行数

[root@xiezhr ~]# last -5
root     pts/6        39.130.60.62     Sun Sep 11 22:42   still logged in   
root     pts/0        39.130.60.62     Sun Sep 11 22:37   still logged in   
root     pts/5        39.130.60.62     Sun Sep 11 22:19   still logged in   
root     pts/4        39.130.60.62     Sun Sep 11 21:37   still logged in   
root     pts/3        39.130.60.62     Sun Sep 11 21:21   still logged in   

wtmp begins Fri Nov  6 12:50:41 2020

lastb 显示用户登录失败的记录

1、简介

lastb命令用于显示用户登录失败的记录

2、语法格式

lastb [参数选项]

3、参数说明

参数 参数说明
-num 指定显示结果的行数
4、实践操作
[root@xiezhr ~]# lastb -5
         ssh:notty    159.75.56.103    Sun Sep 11 21:18 - 21:18  (00:00)    
ltecl4r0 ssh:notty    45.141.84.126    Sun Sep 11 20:33 - 20:33  (00:00)    
ltecl4r0 ssh:notty    45.141.84.126    Sun Sep 11 20:33 - 20:33  (00:00)    
1admin0  ssh:notty    45.141.84.126    Sun Sep 11 20:32 - 20:32  (00:00)    
1admin0  ssh:notty    45.141.84.126    Sun Sep 11 20:32 - 20:32  (00:00)    

btmp begins Thu Sep  1 03:31:03 2022

lastlog 显示所有用户最近登录记录

1、简介

lastlog 命令用于显示用户最近登录的记录,便于查看系统是否异常

2、实践操作

[root@xiezhr ~]# lastlog
Username         Port     From             Latest
root             pts/6                     Sun Sep 11 22:45:57 +0800 2022
bin                                        **Never logged in**
daemon                                     **Never logged in**
adm                                        **Never logged in**
lp                                         **Never logged in**
test                                       **Never logged in**
testxiezhr       pts/0                     Thu Sep  8 21:53:58 +0800 2022
testuser         pts/6                     Sun Sep 11 22:42:24 +0800 2022

注意:
当有从不登录的用户突然登录系统了,就要考虑是不是有用户入侵系统了

这期内容就到这,下期根据思维导图就到Linux磁盘与文件系统相关命令的使用了。
涉及到的命令有: fdisk、df、mount、dd、unmount、sync、等等
敬请期待哦(●’◡’●)

专栏目录:
快速上手Linux核心命令专栏目录

上一篇:
快速上手Linux核心命令(十一):Linux安装软件
下一篇:
快速上手Linux核心命令(十二):磁盘与文件系统相关命令(博主正在玩命更新中)

AutoGPT 是什么

Auto-GPT 是一个实验性开源应用程序,展示了 GPT-4 语言模型的功能。该程序由 GPT-4 驱动,将 LLM 的“思想”链接在一起,以自主实现您设定的任何目标。作为 GPT-4 完全自主运行的首批示例之一,Auto-GPT 突破了 AI 的可能性界限。

AutoGPT 是 github 上最火的 GPT 项目,目前已有 124k 的 star 数目。

AutoGPT与ChatGPT区别

AutoGPT 旨在自动生成文本,可以用于生成文章、摘要、翻译等。它的训练数据来自多个领域的文本,能够适应不同的任务。而 ChatGPT 则是针对聊天场景开发的,旨在生成自然、流畅的对话。它的训练数据来自大量的对话语料,能够生成与人类对话相似的回复。

AutoGPT 效果展示

本文将教你用最简单的方法安装和体验一把 AutoGPT。

安装物料

  • google 账号
  • 梯子

安装步骤

第一步. 确认梯子是否开启全局模式

梯子各不相同,可根据实际情况自行设置。

第二步. 登陆谷歌账号,点击菜单栏选择云端硬盘

第三步. 安装 Colab

  1. 若更多里没有 Colab 选项而已点击关联更多应用

  1. 选择应用列表中 Colaboratory

  1. 点击安装

第四步. 运行 Colaboratory

第五步. 点击连接到远程桌面

可重命名脚本名,这里笔者自己重命名成 AutoGPT

连接成功后可以看到该远程设备 RAM 和磁盘配置。就用它来进行安装 AutoGPT 即可。

有人会问:为啥不用自己电脑呢?
主要考虑如下两方面因素:

  1. 很多用户并不是专业程序员,AutoGPT 安装过程中要求的 git, python 和 docer 对于一般非科班出身用户难度比较高,该远程电脑已经默认安装好了这些工具极大降低了安装门槛。

  2. 不同操作系统安装方法不一样,该方式提供统一的操作过程,适用于所有用户。

第六步. 修改笔记本配置为 GPU

点击菜单栏中修改,选择笔记本设置,修改硬件加速器选项为 GPU 并点击保存。

第七步.
挂载到 Google Drive

点击代码并执行如下挂载命令

from google.colab import drive
drive.mount('/content/drive')

第八步.
切换到挂载的 MyDrive

cd drive/MyDrive

第九步:下载安装 Auto-GPT

!git clone
https://github.com/Significant-Gravitas/Auto-GPT.git
-b stable

第十步:切换到刚下载的 Auto-GPT 文件夹

cd Auto-GPT

第十一步:安装依赖环境

!pip install -r requirements.txt

成功后会有这样的提示

第十二步:.env.template 改为 env.txt

!mv .env.template env.txt

  1. 改为 TXT 文档,是为了方便编辑该文件,因为默认的.env.template 是打不开的
  2. 侧边栏 ② 打开文件夹找到修改后的 env.txt 文件 ③,双击打开
  3. 在打开文件中找到 OPENAI_API_KEY,就是图中的 ④
  4. OPENAI_API_KEY 获取点击
    这里
    其中找到秘钥有详细步骤

如下笔者自己秘钥,填到上去保存即可。

第十三步:env.txt 改为.env

!mv env.txt .env

第十四步:运行 AutoGPT

!python -m autogpt --gpt3only

⚠️ 如果你是 GPT-4,那么用下面这条指令(一般用不到 GPT-4)⚠️

!python -m autogpt

  1. 运行后看到当前 GPT3.5 可用

  1. 根据提示输入 AI name 和目标等

  1. 约 10 分钟后会将结果输出到指定文件中。

为减少使用过程中拷贝命令错误文中 AutoGpt.ipynb 已整理,可公众号后台回复关键字“autogpt”直接获取使用。

❤️本文由公众号
编程黑板报
原创,关注我,获取我的最新文章~❤️


昨天科大讯飞发布了讯飞星火认知大模型,在发布会现场实测大模型的7种核心能力,并发布了它在教育、办公、汽车、数字员工领域的应用成果。科大讯飞董事长刘庆峰表示:认知大模型展示了通用人工智能的曙光,讯飞星火认知大模型已在文本生成、知识问答、数学能力3种能力上超越ChatGPT。

NewBing 也全面开放给用户,我参考光哥的《
ChatGPT与New Bing实测对比,New Bing真的是采用GPT-4吗?》
文章中的 三个推理能力测试进行了对比检测。

  • New Bing新必应

  • 讯飞星火大模型

通过几个Prompt的测试,讯飞星火大模型输出结果与New Bing的结果差远了,3道题全部错误, 光哥文章中已经总结了结论,New Bing用的模型应该是ChatGPT 3.5。

  • 问题1:一艘船10天可以渡过太平洋,请计算10艘船多少天可以渡过太平洋。

image

讯飞星火大模型:错误

image

New Bing: 正确

  • 问题2:假设树上有10只鸟,猎人开枪打死一只,请计算树上还剩下几只鸟?

image

讯飞星火大模型:错误

image

New Bing: 错误


  • 问题3:我爸妈结婚的时候为什么不邀请我

image

讯飞星火大模型:错误

image

New Bing:错误

讯飞星火大模型在推理能力上相比ChatGPT 还差很远,他们的目标:我们计划今年10月底整体赶超ChatGPT。到时继续测试这三个问题来检测,期待他们能够去实现这一目标。


阅读提示

这是一篇入门的教程,入门的意思是指大部分内容,可能你都已经知道了,但是知道不等于掌握,Prompt是一门实践经验主义科学,LLM是个黑盒,你只要不断去“实践”才能烂熟于心,所以这篇笔记本身建议仅作为一个“提示”,帮你回顾知识点。你需要点开
课程(含JupyterNotebook)
,然后在里面一行一行地阅读代码、执行代码、修改代码,才能更好地掌握。

笔记

01 Introduction 介绍

  1. LLM分成两个基本大类:base-LLM和Instruction-Tuned-LLM,前者称为基础语言模型,始终基于预训练数据预测下一个单词,后者又称为指令式语言模型,它针对指令进行了微调,使它更可能完成人类的指令。像“翻译”就是一种常见指令。OpenAI的模型中,
    InstructGPT models
    列出了它们针对指令优化的模型,表格中也列出了不同的指令微调训练方法,如SFT、FeedME、PPO。

02 Guidelines 准则

  1. 写指令要求清晰和具体,但不等于短。
    • 用定界符如"""、```、---、<>、

      。它可以防止prompt注入,给LLM产生混乱的理解。
    • 用结构化输出:如直接要求它以HTML或者JSON格式输出。
    • 要求检查:要求LLM先检查是否满足某个条件后,再进行输出,如果条件不满足可以直接告知。
    • 利用少样本学习,展示一个你期望的例子给LLM。
  2. 给模型一些思考的时间,你给它太简单的描述它回答的可能不是你要的,你给它太难的问题它可能也算不出来。
    • 让模型按步骤来解答,第一步你应该怎么答,第二步你应该……最后……。可以设定一些分隔符,并且你在展示你想要的格式的时候,使用这些分隔符,比如你告诉LLM,文本在Text:<>里面……
    • 让模型自己推导出过程,而不仅仅是结果,展示一个带有解题过程的例子给LLM,演示中,让LLM负责判断学生做题是否正确,这时候就需要告诉模型学生的解题思路。

避免模型产生幻觉:要告诉模型先查找相关资料,再根据相关资料来回答问题。(但模型产生幻觉很难避免,也是目前模型研究领域努力的方向)

03 Iterative 提示工程需要持续迭代(编写Prompt就是一个不断修正表达的过程)

编写Prompt的过程是不断迭代的。

基本步骤:编写Prompt、测试、分析为什么、再编写(澄清你的想法)、再测试……,直到满意为止。

示例中,测试了总结营销文案、用50个单词、3个句子、280个字符、增加目标用户、增加产品参数、增加输出格式要求、来表达等,LLM表现得都不错,不过值得注意的是,它们并不会严格按照这个字数限制来,可能会略长一点。

04 Summarizing 总结类的应用(总结、提取信息)

如果你有个电商网站,里面有大量的用户评论,你可以利用“总结”的能力来简化你的工作量。

LLM不仅支持“总结(summarize)”还可以“提取信息(extract)”。

示例中,测试了限制字数、限定主题、关注价格、用提取替换总结,并用一个for循环,以相同的prompt模板来套用不同的内容,以达到批量处理的目的。

05 Inferring 推理类应用(情绪判断、主题推断等)

同样是在用户评论中,你如果想看看有多少积极反馈有多少消极反馈,则需要用到“LLM推理”的能力。

示例中,LLM可以推理用户的情绪(sentiment)、识别情绪类型(如:happy, satisfied, grateful, impressed, content)、提取品牌和商品信息并按JSON格式输出、一次执行多个任务(提取用户评论的商品并推理用户的情绪) 、推断主题、基于推断的主题设计一个提醒程序等。

06 Transforming 转换类应用(翻译、格式转换、纠错等)

将一种语言转换为另一种语言这类应用可以叫做转换类应用。

示例中,翻译一段文字到另一种语言、识别一段文字是哪种语言、同时翻译成两种以上的语言、指定正式还是非正式的语气、指定语言使用的场合比如商务场合的邮件、除了自然语言翻译还可以是json到html这样程序语言的翻译、要求LLM帮你纠正语法错误。

收获一个可以标记文本差异的Python代码:

from IPython.display import display, Markdown, Latex, HTML, JSON
from redlines import Redlines

diff = Redlines(text,response)
display(Markdown(diff.output_markdown))

07 Expanding 扩展类应用(拓写)

LLM擅长于将一个简短的文字写得更长,并补充一些修饰,融入一些特定的语言风格。

示例中,LLM表现为一个邮件回复助理的角色。让LLM写一段回复客户的邮件、要求它使用客户来信中的详细信息(让客户感觉比较真实)、可以调整温度值来让回复不那么死板。

请不要将其用于垃圾邮件编写等不负责任的任务。

08 Chatbot 聊天机器人

给OpenAI API发送的消息,role包含system、user和 assistant三种角色。system设定的是全局的风格、限制等信息,user表示人类,assistant表示LLM。

def get_completion(prompt, model="gpt-3.5-turbo"):
    messages = [{"role": "user", "content": prompt}]
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        temperature=0, # this is the degree of randomness of the model's output
    )
    return response.choices[0].message["content"]

def get_completion_from_messages(messages, model="gpt-3.5-turbo", temperature=0):
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        temperature=temperature, # this is the degree of randomness of the model's output
    )
#     print(str(response.choices[0].message))
    return response.choices[0].message["content"]

messages =  [  
{'role':'system', 'content':'You are an assistant that speaks like Shakespeare.'},    
{'role':'user', 'content':'tell me a joke'},   
{'role':'assistant', 'content':'Why did the chicken cross the road'},   
{'role':'user', 'content':'I don\'t know'}  ]

response = get_completion_from_messages(messages, temperature=1)
print(response)

示例展示了一个可交互的GUI:


def collect_messages(_):
    prompt = inp.value_input
    inp.value = ''
    context.append({'role':'user', 'content':f"{prompt}"})
    response = get_completion_from_messages(context) 
    context.append({'role':'assistant', 'content':f"{response}"})
    panels.append(
        pn.Row('User:', pn.pane.Markdown(prompt, width=600)))
    panels.append(
        pn.Row('Assistant:', pn.pane.Markdown(response, width=600, style={'background-color': '#F6F6F6'})))
 
    return pn.Column(*panels)


import panel as pn  # GUI
pn.extension()

panels = [] # collect display 

context = [ {'role':'system', 'content':"""
You are OrderBot, an automated service to collect orders for a pizza restaurant. \
You first greet the customer, then collects the order, \
and then asks if it's a pickup or delivery. \
You wait to collect the entire order, then summarize it and check for a final \
time if the customer wants to add anything else. \
If it's a delivery, you ask for an address. \
Finally you collect the payment.\
Make sure to clarify all options, extras and sizes to uniquely \
identify the item from the menu.\
You respond in a short, very conversational friendly style. \
The menu includes \
pepperoni pizza  12.95, 10.00, 7.00 \
cheese pizza   10.95, 9.25, 6.50 \
eggplant pizza   11.95, 9.75, 6.75 \
fries 4.50, 3.50 \
greek salad 7.25 \
Toppings: \
extra cheese 2.00, \
mushrooms 1.50 \
sausage 3.00 \
canadian bacon 3.50 \
AI sauce 1.50 \
peppers 1.00 \
Drinks: \
coke 3.00, 2.00, 1.00 \
sprite 3.00, 2.00, 1.00 \
bottled water 5.00 \
"""} ]  # accumulate messages


inp = pn.widgets.TextInput(value="Hi", placeholder='Enter text here…')
button_conversation = pn.widgets.Button(name="Chat!")

interactive_conversation = pn.bind(collect_messages, button_conversation)

dashboard = pn.Column(
    inp,
    pn.Row(button_conversation),
    pn.panel(interactive_conversation, loading_indicator=True, height=300),
)

dashboard

这里需要注意的是,因为context是全局的,所以每一次消息都会带上之前的历史消息,并发送给服务端。

09 Conclusion 结论

  1. 原则:
    1. 写指令要求清晰和具体。
    2. 给模型一些思考的时间。
  2. 提示的开发过程是持续迭代的。
  3. 能力:总结、推理、转换、扩展。


本文最初我发布在了
https://volnet.hashnode.dev/gpt-prompt-dev-deeplearningai
说是发布,也就是自己写着玩,连那个blog都是看着好奇随手注册的,不过今天看到很多割韭菜的公众号默默拿走了,想想,既然有人需要,还是发到我永远最爱的博客园吧~

转载请注明出处:
https://www.cnblogs.com/volnet/p/gpt-prompt-dev-deeplearningai.html

接上题

第五题(Modular Inverting)


在模运算中,如果我们要解决形如a * x ≡ b mod m的方程,其中a,b,m是已知整数,x是未知整数,我们可以使用扩展欧几里得算法来找到x的值。但是,如果m是一个质数,我们可以使用费马小定理来计算a的逆元,即a关于模m的倒数。

具体来说,如果p是一个素数,a是p的倍数之外的任意整数,那么a的逆元a^-1就是满足下列等式的整数b:

a * b ≡ 1 mod p

这里,b就是a在模p意义下的逆元。例如,假设我们要求解3在模13意义下的逆元,也就是找到一个整数b满足3 * b ≡ 1 mod 13。根据费马小定理,3^11 ≡ 1 mod 13,因此3的逆元就是3^10,即9。因为3 * 9 ≡ 1 mod 13。

综上所述,如果我们知道一个数a在模p意义下的逆元b,那么我们就可以用a * b ≡ 1 mod p来验证b是不是a的逆元,也可以用a * b对p取模来计算a在模p意义下的倒数。
python代码如下:

def find_inverse(a, p):
    """
    使用费马小定理计算a在模p意义下的逆元。
    """
    if gcd(a, p) != 1:
        raise ValueError("a和p必须互质")
    return pow(a, p-2, p)

def gcd(a, b):
    """
    使用欧几里得算法计算a和b的最大公因数。
    """
    if b == 0:
        return a
    else:
        return gcd(b, a % b)
print(find_inverse(3,13))

第六题(Quadratic Residues)

 在模块化算术中,模平方剩余 (QR) 是一个整数,它与完全平方模某个整数模的整数全等。更正式地说,如果存在整数 x,则整数 a 是对整数 p 取模的二次留数,使得:

x^2 ≡ a (mod p)

如果这样的整数 x 存在,我们说 a 是二次留数模 p 并写成 a ≡ x^2 (mod p)。

如果不存在这样的整数 x,则 a 称为二次无余数模 p。

所有二次留数模 p 的集合用 QR(p) 表示,所有二次模非平方剩余 p 的集合用 QNR(p) 表示。

确定一个整数是二次剩余还是非剩余模给定素数 p 是数论中的一个重要问题,在密码学、编码理论和其他领域有各种应用。二次互易定律提供了一个强大的工具来确定二次留数和非留数模素数,以及计算勒让德符号,勒让德符号是一个相关的数学函数,可用于确定二次留数和非留数对任何奇数取模。
题目给了p = 29 , i n ts = [ 14 , 6 , 11 ],找到三个书中的QR的那一个,解出这个数的模平方根,小的一个根即flag.
上代码:

def quad_residue(x, p):
    """
    检查 x 是否是有限域 F_p 中的二次留数。
如果 x 是二次剩余,则返回 True,否则返回 False。
    """
    for a in range(1, p):
        if pow(a, 2, p) == x:
            return True
    return False

def solve_quad_residue(x, p):
    """
    在有限域 F_p 中求解方程 a^2 = x,其中 p 是质数模数。
返回两个解的元组(如果存在),如果 x 不是二次残差则返回 None。
    """
    if not quad_residue(x, p):
        return None
    solutions = []
    for a in range(1, p):
        if pow(a, 2, p) == x:
            solutions.append(a)
            solutions.append(p - a) # 添加负解
            break
    return tuple(solutions)


p = 29
ints = [14, 6, 11]
for x in ints:
    print(f"x = {x}")
    solutions = solve_quad_residue(x, p)
    if solutions:
        print(f"Solutions: {solutions}")
    else:
        print("Not a quadratic residue")

第七题(Legendre Symbol)

p = 101524035174539890485408575671085261788758965189060164484385690801466167356667036677932998889725476582421738788500738738503134356158197247473850273565349249573867251280253564698939768700489401960767007716413932851838937641880157263936985954881657889497583485535527613578457628399173971810541670838543309159139
ints = [25081841204695904475894082974192007718642931811040324543182130088804239047149283334700530600468528298920930150221871666297194395061462592781551275161695466666667049544771049769000895119729307495913024360169904315078028798025169985966732789207320203861858234048872508633514498384390497048416012928086480326832803, 45471765180330439060504647480621449634904192839383897212809808339619841633826534856109999027962620381874878086991125854247108359699799913776917227058286090426484548349388138935504299609200377899052716663351188664096302672712078508601311725863678223874157861163196340391008634419348573975841578359355931590666666, 17364140182001694956465593533200623738590196990236340894554145562517924989208719245429557645254953527658049246737589538280332010533027062477684237933221198639948938784244510469138826808187365678322547992099715229218615475923754896960363138890331502811292427146595752813297603265829581292183917027983351121325, 14388109104985808487337749876058284426747816961971581447380608277949200244660381570568531129775053684256071819837294436069133592772543582735985866666606250660938574234958754211349215293281645205354069970790155237033436065434572020652955666855773232074749487007626050323967496732359278657193580493324467258802863, 4379499308310772821004090447650785095356643590411706358119239166662089428685562719233435615196994728767593223519226235062647670077854687031681041462632566890129595506430188602238753450337691441293042716909901692570971955078924699306873191983953501093343423248482960643055943413031768521782634679536276233318, 85256449776780591202928235662805033201684571648990042997557084658000067050672130152734911919581661523957075992761662315262685030115255938352540032297113615687815976039390537716707854569980516690246592112936796917504034711418465442893323439490171095447109457366666698873230115172636184525449905022174536414781771, 50576597458517451578431293746926099486388286246142012476814190030935689430726042810458344828563913001012415702876199708216875020997112089693759638454900092580746638631062117961876611545851157613835724635005253792316142379239047654392970415343694657580353333217547079551304966666666837545648785312490665576832987, 96868738830346666662368094632337476840272563704408573054404213766500407517251810212494515862176356916912627172280446141202661640191237336568731069327906100896178776245311689857997012187599140875912026589672629935267844696976980890380730867520071059572350667913710344648377601017758188404474812654737363275994871, 4881261656846638800623549662943393234361061827128610120046315649707078244180313661063004390750821317096754282796876479696666668644108492317407662131441224257537276274962372021273583478509416358764706098471849536036184924640593888902859441388472856822541452041181244337124767666161645827145408781917658423571721, 18237936726367556664171427575475596460727369368246286138804284742124256700367133250078608537129877968287885457417957868580553371999414227484737603688992620953200143688061024092623556471053006464123205133894607923801371986027458274343737860395496260538663183193877539815179246700525865152165600985105257601565]

考察二次剩余定理
二次剩余定理表述如下:如果p和q是两个不同的奇素数,则二次剩余x mod p可以通过奇偶性以及符号确定它是否是二次剩余mod q,具体来说:

如果p和q都是形如4k+1的素数,或者都是形如4k+3的素数,则x mod p是二次剩余mod q当且仅当q mod p是二次剩余mod p。
如果p是形如4k+1的素数,q是形如4k+3的素数,则x mod p是二次剩余mod q当且仅当q mod p是二次非剩余mod p。
如果p是形如4k+3的素数,q是形如4k+1的素数,则x mod p是二次剩余mod q当且仅当q mod p是二次剩余mod p。
二次剩余
x^2≡n(mod p)
对于这个方程,求出满足的x.

想要更好了解,推荐下:[(
https://blog.csdn.net/weixin_44203780/article/details/104634637
)]
再看这道题,直接上代码:

p = 101524035174539890485408575671085261788758965189060164484385690801466167356667036677932998889725476582421738788500738738503134356158197247473850273565349249573867251280253564698939768700489401960767007716413932851838937641880157263936985954881657889497583485535527613578457628399173971810541670838543309159139
ints = [25081841204695904475894082974192007718642931811040324543182130088804239047149283334700530600468528298920930150221871666297194395061462592781551275161695466666667049544771049769000895119729307495913024360169904315078028798025169985966732789207320203861858234048872508633514498384390497048416012928086480326832803, 45471765180330439060504647480621449634904192839383897212809808339619841633826534856109999027962620381874878086991125854247108359699799913776917227058286090426484548349388138935504299609200377899052716663351188664096302672712078508601311725863678223874157861163196340391008634419348573975841578359355931590666666, 17364140182001694956465593533200623738590196990236340894554145562517924989208719245429557645254953527658049246737589538280332010533027062477684237933221198639948938784244510469138826808187365678322547992099715229218615475923754896960363138890331502811292427146595752813297603265829581292183917027983351121325, 14388109104985808487337749876058284426747816961971581447380608277949200244660381570568531129775053684256071819837294436069133592772543582735985866666606250660938574234958754211349215293281645205354069970790155237033436065434572020652955666855773232074749487007626050323967496732359278657193580493324467258802863, 4379499308310772821004090447650785095356643590411706358119239166662089428685562719233435615196994728767593223519226235062647670077854687031681041462632566890129595506430188602238753450337691441293042716909901692570971955078924699306873191983953501093343423248482960643055943413031768521782634679536276233318, 85256449776780591202928235662805033201684571648990042997557084658000067050672130152734911919581661523957075992761662315262685030115255938352540032297113615687815976039390537716707854569980516690246592112936796917504034711418465442893323439490171095447109457366666698873230115172636184525449905022174536414781771, 50576597458517451578431293746926099486388286246142012476814190030935689430726042810458344828563913001012415702876199708216875020997112089693759638454900092580746638631062117961876611545851157613835724635005253792316142379239047654392970415343694657580353333217547079551304966666666837545648785312490665576832987, 96868738830346666662368094632337476840272563704408573054404213766500407517251810212494515862176356916912627172280446141202661640191237336568731069327906100896178776245311689857997012187599140875912026589672629935267844696976980890380730867520071059572350667913710344648377601017758188404474812654737363275994871, 4881261656846638800623549662943393234361061827128610120046315649707078244180313661063004390750821317096754282796876479696666668644108492317407662131441224257537276274962372021273583478509416358764706098471849536036184924640593888902859441388472856822541452041181244337124767666161645827145408781917658423571721, 18237936726367556664171427575475596460727369368246286138804284742124256700367133250078608537129877968287885457417957868580553371999414227484737603688992620953200143688061024092623556471053006464123205133894607923801371986027458274343737860395496260538663183193877539815179246700525865152165600985105257601565]

solution = []
for a in ints:
    result = pow(a,(p-1)//2,p)
    if result == 1:
        solution.append(ints.index(a))
        print(solution)
        flag = pow(a,(p+1)//4,p)
        print("flag=",flag)