我目前正在学习如何使用perl以及如何开始编写shellscript。我试图通过回显将代码片段发送到另一个shell脚本,该脚本会加密密码,然后用于在linux中添加新用户。 摘录:
echo "pass=\$(perl -e 'print crypt(\"password\", \"password\")' $password)" >> /home/testscript.sh
将使用以下命令添加新用户:
/usr/sbin/useradd -m -p \$pass testuser
我的问题是:为什么所有的反斜杠?类似于添加用户代码中的\&(perl
,\"password\"
和\$pass
吗?他们需要吗?还是我可以拥有:
echo "pass=$(perl -e 'print crypt("password", "password")' $password)"
/usr/sbin/useradd -m -p &pass testuser
答案 0 :(得分:2)
您发布的一个衬板相当复杂,它嵌套了一堆命令,这种嵌套导致所有反斜杠。
打破它可能会让你清楚起来。
您拥有bash(或类似产品)
$password = 'ABC123'; # set somewhere, using a constant for clarity
echo "pass=\$(perl -e 'print crypt(\"password\", \"password\")' $password)" >> /home/testscript.sh
这会将以下行添加到testscript.sh,可能是bash shell脚本
pass=$(perl -e 'print crypt("password", "password")' ABC123)
请注意,我们已经删除了所有斜杠,并提供了密码。
然后可以将其的前半部分作为一行perl脚本执行。
print crypt("password", "password")
这使用C库crypt函数,使用盐密码来计算密码的哈希值。
因此,必须使用所有斜杠来防止将报价和美元符号之类的元素传播到执行路径的下方。
请注意,此代码实际上并没有用,crypt正在加密一个常量,我假设$password
是要在函数调用内传递的,它在当前位置似乎没有用
还有一个脚本会生成一个调用perl的脚本……看起来并不漂亮。我不了解全部情况,但是我很难相信这是最好的方法。就个人而言,我会避免玩游戏,而只编写一个perl脚本。我个人的经验法则是,任何复杂或超过50行的bash脚本都是在perl中完成的,但这在很大程度上受我不喜欢或不喜欢bash的事实的影响。