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文件中的密码的更多相关文章

  1. 生成/etc/shadow文件中的密码

    shadow文件的格式就不说了.就说说它的第二列--密码列. 通常,passwd直接为用户指定密码就ok了.但在某些情况下,要为待创建的用户事先指定密码,还要求是加密后的密码,例如kickstart文 ...

  2. shadow文件中密码的加密方式

    1) 查看shadow文件的内容 cat /etc/shadow 可以得到shadow文件的内容,限于篇幅,我们举例说明: root:$1$Bg1H/4mz$X89TqH7tpi9dX1B9j5YsF ...

  3. Eclipse建立Web项目,手动生成web.xml文件

    相关文章:https://blog.csdn.net/ys_code/article/details/79156188(Web项目建立,手动生成web.xml文件

  4. linux的PAM认证和shadow文件中密码的加密方式

    它是一种统一的认证方案.PAM 让您能随时改变您的认证方法以及需求,并且不需要重新编译任何代码就封装了所有本地认证方法.具体见 PAM 网站. 对于 PAM 您只需要做: 对您的密码采用不同于 DES ...

  5. 修改VS2010生成的dll文件中的内容

    我的电脑是64为的操作系统,所以先找到下面的路径 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin 找到这个文件:ildasm.exe,如 ...

  6. mapstruct 的 mapstruct-processor 自动生成的 Impl 文件中未设置属性值(时好时坏)

    配置依赖和注解处理器 ... <properties> <org.mapstruct.version>1.4.2.Final</org.mapstruct.version ...

  7. 生成linux shadow文件

    -salt $(< /dev/urandom ) -stdin $$cVcjk1yK$sfdBsYIEr800Mdr3PsICe0 $$oBrzawaF$WeVJjd2eyoEEmJykNtMH ...

  8. 将生成的Debug文件中的exe文件添加图标

    制作.ico图片地址:https://www.bitbug.net/

  9. Centos7系统kvm虚机忘记密码进不去, 通过宿主机修改/etc/shadow文件改密码,重启后系统起不来故障排错

    问题描述 某天, 因为其他项目组交接问题, kvm里面的堡垒机系统用户root密码登录不上,然后他通过宿主机修改/etc/shadow文件修改密码,但是修改完后重启系统后发现kvm宿主机连接不上虚机了 ...

随机推荐

  1. 20155205 郝博雅 Exp7 网络欺诈防范

    20155205 郝博雅 Exp7 网络欺诈防范 一.实践内容 (1)简单应用SET工具建立冒名网站 (1分) (2)ettercap DNS spoof (1分) (3)结合应用两种技术,用DNS ...

  2. scrapy的入门使用(二)

    1. scrapy实现翻页请求 找到下一页的url地址 构造url地址的请求,传递给引擎 1.1 实现翻页请求 使用方法 在获取到url地址之后,可以通过scrapy.Request(url,call ...

  3. Windows服务器开发和Linux服务器软件开发的区别

    大型网页游戏服务器开发(Windows+Linux) 进程监听 负载均衡 数据库分发 MapGIS IGServer(Java C++)

  4. Python TVTK 标量数据可视化与矢量数据可视化,空间轮廓线可视化

    Python数据可视化分为 标量可视化,矢量可视化,轮廓线可视化 标量又称无向量,只有大小没有方向,运算遵循代数运算法则比如质量,密度,温度,体积,时间 矢量又称向量,它是由大小,方向共同确定的量,运 ...

  5. UniGui中使用Grid++Report报表控件子报表获取数据的方法

    Grid++Report是为优秀的报表控件,子报表是其重要功能之一,但Grid++Report提供的网页报表示范主要是以页面为主的,UniGui在Delphi中以快速编写web管理软件著称,但由于资料 ...

  6. Encrypt2

    begin#33AB6770A8A98127BD0B5A6DAEC68E5E9385C02D24C850B12987FE36CF1A62738174C6FE5336E3B50048E836238582 ...

  7. 学习Java的进度

    这周我们通过老师的讲解带着我们回到了第八周的知识点.lambda表达式也是一种简化程序的好方法,通过回调程序的测试可以对比出lambda 表达式少的不是一两行代码,可以少了类中方法的定义,直接使用.内 ...

  8. apache与tomcat负载集群集成方法配置

    apache与tomcat负载集群集成方法有3种jk.jk_proxy.http_proxy apache:httpd-2.2.17-win32-x86-no_ssl.msi tomcat:apach ...

  9. Node.js的安装以及npm的基础使用

    索引: Node.js的安装以及Node.js的模块管理Node.js开发环境搭建以及对ES6的支持Node.js构建Vue.js项目Vue.js单文件组件的开发基于Vue.js的UI组件(Eleme ...

  10. [翻译] Visual Studio 2019 RC版发布

    [翻译] Visual Studio 2019 RC版发布 原文: Visual Studio 2019 Release Candidate (RC) now available 今天,我们将分享 V ...