Featured image of post 如何使用命令行生成随机密码

如何使用命令行生成随机密码

使用PowerShell和Bash生成随机密码

为什么要用命令行

因为很方便啊

PowerShell

Win+X然后按A打开powershell
使用以下命令生成随机密码(包含数字、字母和符号):

包含12个可打印ASCII字符

1
-join (33..126 |%{[char]$_} | Get-Random -Count 12)

命令说明:

  1. 33..126 生成ASCII码从33(!)到126(~)的全部可打印字符范围
  2. |%{[char]$_} 将ASCII码转换为字符
  3. Get-Random -Count 12 随机选取12个字符
  4. -join 将字符数组拼接为字符串

示例输出:_zT5E}uK<79}

可通过修改-Count参数调整密码长度,例如-Count 16生成16位密码

哦对了,ASCII码33-126包含全部可打印的非控制字符,具体分类如下:

  1. 标点符号 (33-47,58-64,91-96,123-126)
    ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~
    包含各类常见标点、括号和运算符

  2. 数字 (48-57)
    0 1 2 3 4 5 6 7 8 9

  3. 大写字母 (65-90)
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

  4. 小写字母 (97-122)
    a b c d e f g h i j k l m n o p q r s t u v w x y z

Bash

Ctrl+Alt+T打开终端,输入以下命令生成随机密码(包含数字、字母和符号):

1
openssl rand -base64 12

命令说明

生成的字符串包含大小写字母、数字和+/=三个符号,总共64个字符

示例输出:gtz5JBkda+zkvNhe

扩展选项

1. 跟上面Powershell同样多符号的

1
tr -dc '\41-\176' </dev/urandom | head -c12

命令说明

  • tr -dc '\41-\176'
    • \41(八进制)= 33 = !
    • \176(八进制)= 126 = ~
    • -d删除输入中的匹配项,-c取补集(保留指定范围)
  • </dev/urandom 系统随机源
  • head -c12 取12个字符

示例输出:qK!9c#0}L$l]

疑难排查

  1. 如果locale设置不当,可能导致tr命令无法正确处理ASCII字符范围,可通过LC_ALL=C强制指定locale为C解决
1
LC_ALL=C tr -dc '\41-\176' </dev/urandom | head -c12
  1. 如果你想在输出之后换行,可以使用echo命令
1
tr -dc '\41-\176' </dev/urandom | head -c12; echo

2. 提升密码强度 - 使用多次密码生成筛选:

1
while :; do pw=$(tr -dc '\41-\176' </dev/urandom | head -c12); [[ "$pw" =~ [[:digit:]] && "$pw" =~ [[:upper:]] ]] && break; done; echo "$pw"

强制至少包含1个数字和大写字母

3. 不用记数字的版本

如果你不记得41和176的话

1
2
head /dev/urandom | tr -dc '[:graph:]' | head -c12; echo
# 其中 '[:graph:]' = 空格以外的可打印字符(33-126)
Licensed under CC BY-NC-SA 4.0