手动生成/etc/shadow文件中的密码
shadow文件的格式就不说了。就说说它的第二列——密码列。
通常,passwd直接为用户指定密码就ok了。但在某些情况下,要为待创建的用户事先指定密码,还要求是加密后的密码,例如kickstart文件中的rootpw指令,ansible创建用户时提前指定密码等,这时候不得不手动生成合理的密码。
先说说shadow文件中第二列的格式,它是加密后的密码,它有些玄机,不同的特殊字符表示特殊的意义:
- ①.该列留空,即"::",表示该用户没有密码。
- ②.该列为"!",即":!:",表示该用户被锁,被锁将无法登陆,但是可能其他的登录方式是不受限制的,如ssh公钥认证的方式,su的方式。
- ③.该列为"*",即":*:",也表示该用户被锁,和"!"效果是一样的。
- ④.该列以"!"或"!!"开头,则也表示该用户被锁。
- ⑤.该列为"!!",即":!!:",表示该用户从来没设置过密码。
- ⑥.如果格式为"$id$salt$hashed",则表示该用户密码正常。其中$id$的id表示密码的加密算法,$1$表示使用MD5算法,$2a$表示使用Blowfish算法,"$2y$"是另一算法长度的Blowfish,"$5$"表示SHA-256算法,而"$6$"表示SHA-512算法,
目前基本上都使用sha-512算法的,但无论是md5还是sha-256都仍然支持。$salt$是加密时使用的salt,hashed才是真正的密码部分。
下文都以生成明文"123456"对应的加密密码为例。
要生成md5算法的密码,使用openssl即可。
openssl passwd -1 ''
openssl passwd -1 -salt 'abcdefg' ''
生成密码后,直接将其拷贝或替换到shadow文件的第二列即可。例如:替换root用户的密码
shell> field=$(awk -F ':' '/^root/{print $2}' /etc/shadow)
shell> password=$(openssl passwd -1 123456)
shell> sed -i '/^root/s%'$field'%'$password'%' /etc/shadow
但openssl passwd不支持生成sha-256和sha-512算法的密码。在CentOS 6上,可以借助grub提供的密码生成工具grub-crypt生成。
[root@server1 ~]# grub-crypt -h
Usage: grub-crypt [OPTION]...
Encrypt a password. -h, --help Print this message and exit
-v, --version Print the version information and exit
--md5 Use MD5 to encrypt the password
--sha-256 Use SHA-256 to encrypt the password
--sha-512 Use SHA-512 to encrypt the password (default) Report bugs to <bug-grub@gnu.org>.
EOF
[root@server1 ~]# grub-crypt --sha-512
Password:
Retype password:
$6$nt4hMDAYqYjudvfo$AKIZ3Z0o6/6HV6GKXqq21VEmh.ADFAZUQw2mvbIlplKx7gu9MQiEWjdmHnF2YPnYzgce1cP/bzDguVnUkMg/N.
grub-crypt其实是一个python脚本,交互式生成密码。以下是grub-crypt文件的内容。
[root@server1 ~]# cat /sbin/grub-crypt
#! /usr/bin/python '''Generate encrypted passwords for GRUB.''' import crypt
import getopt
import getpass
import sys def usage():
'''Output usage message to stderr and exit.'''
print >> sys.stderr, 'Usage: grub-crypt [OPTION]...'
print >> sys.stderr, 'Try `$progname --help\' for more information.'
sys.exit(1) def gen_salt(): # 生成随机的salt
'''Generate a random salt.'''
ret = ''
with open('/dev/urandom', 'rb') as urandom:
while True:
byte = urandom.read(1)
if byte in ('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
'./0123456789'):
ret += byte
if len(ret) == 16:
break
return ret def main():
'''Top level.'''
crypt_type = '$6$' # SHA-256
try:
opts, args = getopt.getopt(sys.argv[1:], 'hv',
('help', 'version', 'md5', 'sha-256',
'sha-512'))
except getopt.GetoptError, err:
print >> sys.stderr, str(err)
usage()
if args:
print >> sys.stderr, 'Unexpected argument `%s\'' % (args[0],)
usage()
for (opt, _) in opts:
if opt in ('-h', '--help'):
print (
'''Usage: grub-crypt [OPTION]...
Encrypt a password. -h, --help Print this message and exit
-v, --version Print the version information and exit
--md5 Use MD5 to encrypt the password
--sha-256 Use SHA-256 to encrypt the password
--sha-512 Use SHA-512 to encrypt the password (default) Report bugs to <bug-grub@gnu.org>.
EOF''')
sys.exit(0)
elif opt in ('-v', '--version'):
print 'grub-crypt (GNU GRUB 0.97)'
sys.exit(0)
elif opt == '--md5':
crypt_type = '$1$'
elif opt == '--sha-256':
crypt_type = '$5$'
elif opt == '--sha-512':
crypt_type = '$6$'
else:
assert False, 'Unhandled option'
password = getpass.getpass('Password: ')
password2 = getpass.getpass('Retype password: ')
if not password:
print >> sys.stderr, 'Empty password is not permitted.'
sys.exit(1)
if password != password2:
print >> sys.stderr, 'Sorry, passwords do not match.'
sys.exit(1)
salt = crypt_type + gen_salt()
print crypt.crypt(password, salt) # 生成最终的加密密码 if __name__ == '__main__':
main()
很不幸,CentOS 7上默认安装的是grub2,它不提供grub-crypt。因此参照grub-crypt内容,使用下面的python语句简单代替grub-crypt,这同样也是交互式的。
python -c 'import crypt,getpass;pw=getpass.getpass();print(crypt.crypt(pw) if (pw==getpass.getpass("Confirm: ")) else exit())'
如果不想交互式,再改成如下形式:
python -c 'import crypt,getpass;pw="123456";print(crypt.crypt(pw))'
现在就方便多了,直接将结果赋值给变量即可。
[root@server1 ~]# a=$(python -c 'import crypt,getpass;pw="123456";print(crypt.crypt(pw))')
[root@server1 ~]# echo $a
$6$uKhnBg5A4/jC8KaU$scXof3ZwtYWl/6ckD4GFOpsQa8eDu6RDbHdlFcRLd/2cDv5xYe8hzw5ekYCV5L2gLBBSfZ.Uc166nz6TLchlp.
例如,ansible创建用户并指定密码:
a=$(python -c 'import crypt,getpass;pw="123456";print(crypt.crypt(pw))')
ansible 192.168.100.55 -m user -a 'name=longshuai5 password="$a" update_password=always'
手动生成/etc/shadow文件中的密码的更多相关文章
- 生成/etc/shadow文件中的密码
shadow文件的格式就不说了.就说说它的第二列--密码列. 通常,passwd直接为用户指定密码就ok了.但在某些情况下,要为待创建的用户事先指定密码,还要求是加密后的密码,例如kickstart文 ...
- shadow文件中密码的加密方式
1) 查看shadow文件的内容 cat /etc/shadow 可以得到shadow文件的内容,限于篇幅,我们举例说明: root:$1$Bg1H/4mz$X89TqH7tpi9dX1B9j5YsF ...
- Eclipse建立Web项目,手动生成web.xml文件
相关文章:https://blog.csdn.net/ys_code/article/details/79156188(Web项目建立,手动生成web.xml文件
- linux的PAM认证和shadow文件中密码的加密方式
它是一种统一的认证方案.PAM 让您能随时改变您的认证方法以及需求,并且不需要重新编译任何代码就封装了所有本地认证方法.具体见 PAM 网站. 对于 PAM 您只需要做: 对您的密码采用不同于 DES ...
- 修改VS2010生成的dll文件中的内容
我的电脑是64为的操作系统,所以先找到下面的路径 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin 找到这个文件:ildasm.exe,如 ...
- mapstruct 的 mapstruct-processor 自动生成的 Impl 文件中未设置属性值(时好时坏)
配置依赖和注解处理器 ... <properties> <org.mapstruct.version>1.4.2.Final</org.mapstruct.version ...
- 生成linux shadow文件
-salt $(< /dev/urandom ) -stdin $$cVcjk1yK$sfdBsYIEr800Mdr3PsICe0 $$oBrzawaF$WeVJjd2eyoEEmJykNtMH ...
- 将生成的Debug文件中的exe文件添加图标
制作.ico图片地址:https://www.bitbug.net/
- Centos7系统kvm虚机忘记密码进不去, 通过宿主机修改/etc/shadow文件改密码,重启后系统起不来故障排错
问题描述 某天, 因为其他项目组交接问题, kvm里面的堡垒机系统用户root密码登录不上,然后他通过宿主机修改/etc/shadow文件修改密码,但是修改完后重启系统后发现kvm宿主机连接不上虚机了 ...
随机推荐
- ffmpeg源码编译安装(Compile ffmpeg with source) Part 1 : 通用部分
本页内容包含了在Unix/Linux中用源码包编译的通用的结构 可能不仅仅适用于ffmpeg 为啥使用源码包编译 编译源码可以扩展功能, 实现相对于自己平台的最优化, 还可以自定义的修改 概述 大部分 ...
- oracle 恢复table删除数据 恢复package(使用闪回)
好久没写东西了,今天写一篇凑个数吧,来公司一年多了,感觉自己到了一个小瓶颈期了. 以前每天很多新东西,都是忙着学,感觉没时间写博客总结一下,大部分都是写笔记,现在又是没东西可以写,每天干着95%都是重 ...
- 计算机网络六:无线局域网、IEEE 802.11、WIFI和蓝牙
无线局域网.IEEE 802.11.WIFI和蓝牙 ㈠无线局域网 1.定义 无线局域网络(Wireless Local Area Networks),简称WLAN.它是相当便利的数据传输系 ...
- android项目生成aar和引用aar解决方案
引用依赖在项目中很常见,java开发一般是引用jar,所以android大家一般也是引用jar,但是android引用jar有时候会出现各种包冲突,很头痛!, 其实android有自己独特的引用aar ...
- SecureCRT使用帮助
文件上传下载 1. 安装 yum -y install lrzsz (参数-y中"y"的意思是:当安装过程提示选择全部为"yes") 2.上传 第一种方式:rz ...
- 运维工具pssh和pdsh安装和使用
1. pssh安装与使用 1.1 pssh安装 [root@server]# wget http://peak.telecommunity.com/dist/ez_setup.py [root@ser ...
- 【每日一点】1. Java如何实现导出Excel单表头或多表头
一.背景 在后台项目中,经常会遇到将呈现的内容导出到Excel的需求,通过都是导出单个表头的Excel文件,如果存在级联关系的情况下,也就需要导出多表头的场景.今天这篇文章就是分享导出Excel单表头 ...
- kafka学习笔记——基本概念与安装
Kafka是一个开源的,轻量级的.分布式的.具有复制备份.基于zooKeeper协调管理的分布式消息系统. 它具备以下三个特性: 能够发布订阅流数据: 存储流数据时,提供相应的容错机制 当流数据到达时 ...
- 自学自用 = B站(操作系统_清华大学(向勇、陈渝)) 未完待续。。
视频地址 https://www.bilibili.com/video/av6538245 介绍 本篇博客,旨在记录视频学习的要点,所以格式随意, 方便本人日后自考和回忆,有兴趣的朋友可以评论讨论. ...
- Java 多线程开发之 Callable 与线程池
前言 我们常见的创建线程的方式有 2 种:继承 Thread 和 实现 Runnable 接口. 其实,在 JDK 中还提供了另外 2 种 API 让开发者使用. 二.简单介绍 2.1 Callabl ...