
在使用基于Powershell自动化的脚本中,大多数场景下需要未脚本传递凭据以供验证环节能够正常工作,很多管理员习惯于在他们的脚本中使用明文密码,但如果是测试脚本,倒是无关紧要,若是用于生产环境的脚本,这种行为不但很糟糕,还很可怕,不怀好意的同志们会很乐意并轻松的拿到它然后搞一些或轻或重的破坏。但是,如果正确使用powershell所提供的密码加密功能,能很轻松的解决这个问题。
PowerShell中,提供了两种生成凭据的方式分别是 Get-Credential 和 Read-Host
Get-Credential
Get-Credential 命令被用来创建PSCredential对象并且将之存储到变量中,并保证不在屏幕上显示如下
上面的命令将凭据信息保存到变量 $crd 中 ,这个变量可被很容易的用于访问需指定凭据的 Cmdlets
Read-Host
使用 Read-Host 同样可以起到保护明文密码显示的功能 如下, -AsSecureString 可以将明文密码存储成加密密码串对象,SecureString对象可被用于可接受该类型参数的命令,可以通过定义变量和管道输出将该对象传递给命令。
ConvertTo-SecureString
ConvertTo-SecureString 用于加密密码和其它字符串,它可以接受字符串然后输出为SecureString对象,SecureString对象可被用于可接受该类型参数的命令,可以通过定义变量和管道输出将该对象传递给命令。
语法如下:
当不适用参 -Key 或者 -SecureKey 时,PowerShell将会调用 Windows Data Protection API (DPAPI) 加密\解密字符串。但这将导致生成的 SecureString 对象在其它计算机上使用。
如下将把明文"Password"转化为 SecureString
这种方式虽然能够将明文字符转换为 SecureString 对象,但是却无法将其存储为一个文件以后用。必须把它转化为标准加密字符串才可以,要达到这个目的,要用到 ConvertFrom-SecureString 命令。
ConvertFrom-SecureString
使用 ConvertFrom-SecureString 命令可以将 SecureString 对象存储成为标准加密字符串,可以将 SecureString 对象或者命令产生的 SecureString 对象通过管道传给它来实现
语法:
上面的例子产生的 SecureString 对象可以用于此处转换成标准加密字符串
结合上面几个命令,我们可以有以下几种方法将 SecureString 转换成的标准加密字符串通过 Out-File 命令存储成txt文件
导出纯文本模式生成的 SecureString 对象
导出 Get-Credential 产生的 SecureString 对象
导出通过 Read-Host 产生的 SecureString 对象
将上述存储的标准加密字符串文件转换回 SecureString 并用来创建 PSCredential
上面提到,在使用 ConvertTo-SecureString 和 ConvertFrom-SecureString 加密凭据时,如不使用 -Key 或 -SecureKey ,则PowerShell会调用DPAPI进行加解密,因为无法再创建其之外的机器上使用,如下
同一台主机
不同主机上使用上面同一个txt文件
使用 Key 或者 SecureKey 实现跨机器使用加密文件
使用 -Key 参数创建保存标准加密字符串的文件,下面将会用到Windows Class “SystemSecurityCryptographyRNGCryptoServiceProvider"来创建随机数据来填充作为 -Key 的参数值的数组
使用随机数据来创建AES key并导出为文件
创建 SecureString 对象
创建凭据
在另外的机器上
上面的内容已经完全可以帮助我们在powershell脚本中来加密密码了,如果有其它问题欢迎留言。
10分 太少了额。。。
如果要方便、安全并且自动化最好使用 expect 。 Shell本身 不能处理 这种问题。
自己随意选择两个端口号
B 服务器 port_B
A 服务器 port_A
B 机器:
安全机制:在B机器上设置iptables 使得 端口XB只能接受 A服务器 IP 来自端口XA 的数据。
nc -l port_B > file
监听 port_B 输出到file
A 机器:
nc B_IP portB - p portA <file
读取file 从本机portA 发送到B_IP:portB
-----------
写成两个脚本
由于命令是明文传输的,可以使用md5加密数据。
B 机器上将脚本写成一个监听脚本。
我就不给你写具体的了 给你一个描述。
#!/bin/bash
tmpfile=临时文件绝对路径
OUTPUT=~/out
portA=12345
portB=99999
B_IP=1921681167
while true;do
cmd="`nc -l port_B`"
#获取由B机器发送来的命令目前假设有2个命令
#如 setoutput XXXX 设置OUTPUT文件绝对路径; starttrans 开始传输
case cmd
命令是 setoutput XXXX
OUTPUT=XXXX
命令是 starttrans
nc -l port_B > "$tmpfile"
mv $tmpfile $OUTPUT
esac
done
A 服务器上写成传输脚本sendfile需要一个参数:
# sendfile filename
#!/bin/bash
filename="$1"
portA=12345
portB=99999
B_IP=1921681167
echo setoutput ”$filename“|nc B_IP portB -s portA
echo starttrans|nc B_IP portB -s portA
nc B_IP portB -s portA<"$filename"
先确认一下su -c 能否解决问题,语法 su - <user name> -c <cmd> 以指定用户执行命令
[root@fw98 /]# whoami
root
[root@fw98 /]# su - mao -c whoami
mao
不能满足需求的话,可以用expect,我的环境上没有expect,不能帮你试了,大致是下面的感觉,详细你百度查一下
#!/usr/bin/expect
su - mao #你要执行的命令
expect "Password:" #执行后终端回显的交互信息
send "admin_123\r" #当终端出现上面的交互详细后,模拟键盘输入的内容
#此例,执行su - mao 切换mao用户,终端提示输入密码后,模拟键盘输入mao用户的密码
cat filename |while read username group password
do
useradd -g $group $username && passwd $username <<EOF
$password
$password
EOF
done
以上就是关于在Powershell脚本中安全的使用密码信息全部的内容,包括:在Powershell脚本中安全的使用密码信息、shell脚本不用expect怎么实现输入密码、SHELL脚本切换用户需输入密码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)