Shell 命令行,实现一个获取任意位数的随机密码的脚本

每次我们想要获得一个密码的时候都很头疼,于是我之前自己用nodejs写了一个 Shell 脚本。这两天在学习 bash Shell 所以,想用同样的逻辑实现一个获取任意位数随机密码的脚本。

我成功了 :)

分析问题

我们假设我们需要的密码是大小写字母以及数字的组合,并且剔除掉 1,l,0,O,o 这些不便于认知的字符。

然后随机的读取其中的字符,组合成一个我们需要的密码,最后输出。

理顺了逻辑之后,我想到有下面的知识点是我之前不是很熟悉的。不过没关系,善用搜索引擎,这些问题都能解决

  1. 任意位数,所以需要接受传参
  2. 如果没有传参,则要给一个默认值
  3. 需要实现随机数效果
  4. 字符串追加,这个倒是蛮简单的
  5. 获取字符串中指定位数的字符
  6. 数字向上取整

实现代码

最终代码如下:

#!/bin/bash
# 如果得到参数 则将得到的参数作为密码的位数,否则指定密码位数为8
if [ -n "$1" ]; then length=$1;
else length=8; fi

# 设定可以作为密码的字符串
chars='abcdefghijkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ23456789'

# 获取上面的字符串的长度,其实可以直接数一下,这不是练一下 shell 嘛
charsLength=`echo $chars | wc -m | sed 's/^[ \t]*//g'`

# 初始的为空
pw=''

# 根据所需密码长度进行循环
for ((i=0;i<$length;i++));do

  # 取得一个随机数
  # $RANDOM 是获取一个小于 32767 的随机数
  # 所以除以 32767 就可以得到一个 0 - 1 之间的随机小数
  r=`echo $RANDOM/32767 | bc -l`

  # 根据随机数*字符长度取得一个数字
  num=`echo $r*$charsLength | bc`

  # 将取得数字向上取整,并在字符串中截取对应位置的字符
  w=`echo $chars | cut -c$((${num//.*/+1}))`

  # 字符追加到 pw 这个变量
  pw=$pw$w
done

# 输出我们想要的密码
echo $pw

运行一下,果然得到了我们想要的结果。

将这个命令作为一个系统命令,可以随时执行

  1. 我们在 ~目录下面新建一个 .bin 的文件夹
  2. ~/.bin 设置为环境变量
  3. 然后将此脚本放到改文件夹下面,并命名为 getpass
  4. chmod +x getpass 添加可执行权限

然后我们就可以随时输出这个命令,来得到我们想要的密码了。

~/.bin 设置为环境变量

cd ~
mkdir .bin
vim .bash_profile

.bash_profile 文件中添加

export PATH="$PATH:~/.bin"

其他不说了,学习 shell 的话,一些基本的命令应该是没有问题的。

以上脚本均在 mac 下测试通过,在 Linux 下可能会有稍许不同。

本文由 FungLeo 原创,允许转载,但转载必须保留首发链接。

Shell 命令行,实现一个获取任意位数的随机密码的脚本的更多相关文章

  1. Shell 命令行,写一个自动整理 ~/Downloads/ 文件夹下文件的脚本

    Shell 命令行,写一个自动整理 ~/Downloads/ 文件夹下文件的脚本 在 mac 或者 linux 系统中,我们的浏览器或者其他下载软件下载的文件全部都下载再 ~/Downloads/ 文 ...

  2. Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件

    Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件 前面我写了一篇博文Shell 从日志文件中选择时间段内的日志输出到另一个文件,利用循环实现了我想要实现的内容. 但是用这个脚本的同 ...

  3. Shell 命令行获取本机IP,grep的练习

    Shell 命令行获取本机IP,grep的练习 在 mac 下面输入 ifconfig 或者在 linux 下面输入 ip a 就可以得到我们的网卡信息.不过通常情况下,我们需要查看的是我们的IP地址 ...

  4. shell 命令行参数(getopt和getopts)

    getopt 命令 使用getopt命令,可以解析任何命令行选项和参数,但是用法比较复杂.getopt的命令用法如下: $ getopt --help 用法: getopt optstring par ...

  5. 几种在shell命令行中过滤adb logcat输出的方法

    我们在Android开发中总能看到程序的log日志内容充满了屏幕,而真正对开发者有意义的信息被淹没在洪流之中,让开发者无所适从,严重影响开发效率.本文就具体介绍几种在shell命令行中过滤adblog ...

  6. Shell 命令行,实现对若干网站状态批量查询是否正常的脚本

    Shell 命令行,实现对若干网站状态批量查询是否正常的脚本 如果你有比较多的网站,这些网站的运行状态是否正常则是一件需要关心的事情.但是逐一打开检查那简直是一件太糟心的事情了.所以,我想写一个 sh ...

  7. Shell 命令行统计 apache 网站日志访问IP以及IP归属地

    Shell 命令行统计 apache 网站日志访问IP以及IP归属地 我的一个站点用 apache 服务跑着,积攒了很多的日志.我想用 shell 看看有哪些人访问过我的站点,并且他来自哪里. 因为日 ...

  8. Shell 命令行求两个文件每行对比的相同内容

    Shell 命令行求两个文件每行对比的相同内容 遇到的一个实际问题是,2017年08月01日起,所有未经实名的域名,全部停止解析.而我手上有不少域名,其中很多都是没有实名的.但我不知道哪些实名了,哪些 ...

  9. * 和 ?在 shell 命令行中与在正则表达式中的区别

    Linux 正则表达式 你有没有想过,在 shell 命令行中的 *,?和正则表达式中的*,?是否一样? 自打好多年前接触 DOS,就知道了* 和?这两个通配符(Wildcard),象 dir *.* ...

随机推荐

  1. 20145324 《Java程序设计》第3周学习总结

    20145324 <Java程序设计>第3周学习总结 教材学习内容总结 第四章 1.要产生对象必须先定义类,类是对象的设计图,对象是类的实例,建立实例要用new 2.参数名称与对象数据成员 ...

  2. 蓝桥杯练习——C++输出阶乘的最右边一位非零数

    #include<iostream> #include<iomanip> using namespace std; #define M 10000 #define N 1000 ...

  3. IDEA 安装mybatis 插件 可以通过mapper定位到xml

    在使用IDEA的时候 ,通过mapper类定位到 xml文件是让人很头疼的问题! 无意中发现了这个插件!可以通过类方法直接定位到xml中!比较强大!哈哈! 这玩意好像是付费的! 不过不破解也能用! 哈 ...

  4. SEM关键词的三种分类方式

    关键词分类是为了使sem账户搭建结构清晰便于管理关键词.基于对需求人群的深入分析,每个账户都有其独特的分类方式,比如招商加盟行业更多的是地域分类,品牌类企业通常用词性分类即可,而冷门行业用人群分类比较 ...

  5. LeetCode——4Sum

    1. Question Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + ...

  6. 线程实现Runnable接口比继承Thread的优势

    1.适合多个相同程序代码的线程去处理同一资源,把虚拟CPU(线程)同程序的代码.数据有效分离,较好地体现了面向对象的设计思想.2.可以避免由于java单继承特性带来的局限.3.增强了程序的健壮性,代码 ...

  7. 【论文解析】MTCNN论文要点翻译

    目录 0.论文连接 1.前言 2.论文Abstract翻译 3.论文的主要贡献 4.4 训练 5 模型性能分析 5.1 关于在线挖掘困难样本的性能 5.2 将人脸检测与对齐联合的性能 5.3 人脸检测 ...

  8. Mybatis中传参包There is no getter for property named 'XXX' in 'class java.lang.String'

    Mybatis中传参包There is no getter for property named 'XXX' in 'class java.lang.String' 一.发现问题 <select ...

  9. Spring Cloud 坑点

    1 配置中心 1.config 默认Git加载 通过spring.cloud.config.server.git.uri指定配置信息存储的git地址,比如:https://github.com/spr ...

  10. .net知识点汇总

    死锁的必要条件?怎么克服? 答:系统的资源不足,进程的推进的顺序不合适,资源分配不当,一个资源每次只能被一个进程使用,一个资源请求资源时,而此时这个资源已阻塞,对已获得资源不放,进程获得资源时,未使用 ...