bash: while read loop - 如果有变量 sshpass 则停止
Posted
技术标签:
【中文标题】bash: while read loop - 如果有变量 sshpass 则停止【英文标题】:bash: while read loop - stop if there is variable sshpass 【发布时间】:2013-12-27 11:41:06 【问题描述】:我的 bash 脚本有问题。我逐行读取变量lvm_path_exec,它有效。我用 echo "lvmpath" 确认了它。 但是一旦我将 sshpass 命令放入 while 语句中,脚本只会处理被 grepped 的第一行。
如果没有 sshpass 命令,lvmpath_exec 的所有行都会得到处理。
你看到错误了吗?
lvmpath_exec=$(sshpass -p "$password[$i]" ssh $user[$i]@$ip[$i] -p $port[$i] lvdisplay | grep datatest -A 3 | grep Path | awk ' print $3 ')
echo "$lvmpath_exec" | while read lvmpath
do
lvmname=datatest
snap=_snapshot
snapname=$lvmname$snap
lvcreate=$(sshpass -p "$password[$i]" ssh $user[$i]@$ip[$i] -p $port[$i] lvcreate -L20G -s -n $snapname $lvmpath)
snap_path=$(sshpass -p "$password[$i]" ssh $user[$i]@$ip[$i] -p $port[$i] lvdisplay | grep $snapname -A 3 | grep Path | awk ' print $3 ')
transfer=$(sshpass -p "$password[$i]" ssh $user[$i]@$ip[$i] -p $port[$i] "dd if=$snap_path | gzip -c" > /tmp/$snapname)
delsnap=$(sshpass -p "$password[$i]" ssh $user[$i]@$ip[$i] -p $port[$i] lvremove -f $snap_path)
done
更新
我修复了它: 替换
echo "$lvmpath_exec" | while read lvmpath
与
for lvmpath in $lvmpath_exec
但它不应该在读时也能工作吗?
【问题讨论】:
【参考方案1】:你试过这个吗..虽然没试过
export SSHPASS=password[$i]
sshpass -e ssh -oBatchMode=no user[$i]@ip[$i] ..
【讨论】:
我现在修好了。我没有对此进行测试,但我认为它不会修复它。谢谢你的回答。【参考方案2】:sshpass
通过操纵stdin
来欺骗ssh
使其认为它正在从交互式用户那里获取密码。当您使用... | while
样式循环时,循环对来自stdin
的每一行进行迭代,sshpass
在第一次调用后将其清除,这就是为什么只执行第一行的原因。 for
循环没有使用stdin
,所以它没有这个问题。
正如man sshpass
解释的那样,这个工具本质上是不安全的,您应该真正使用公钥身份验证。还要记住,它还有其他传递密码的方法,使用-p
标志是最不安全的方法,任何其他方法都会更安全,例如-e
标志似乎非常简单。我知道您可能会坚持认为您有一个合法的用例,但这非常重要,我只想从手册页中引用:
First and foremost, users of sshpass should realize that ssh's insis‐ tance on only getting the password interactively is not without reason. It is close to impossible to securely store the password, and users of sshpass should consider whether ssh's public key authentication pro‐ vides the same end-user experience, while involving less hassle and being more secure. The -p option should be considered the least secure of all of sshpass's options. All system users can see the password in the command line with a simple "ps" command. Sshpass makes a minimal attempt to hide the password, but such attempts are doomed to create race conditions with‐ out actually solving the problem. Users of sshpass are encouraged to use one of the other password passing techniques, which are all more secure.
【讨论】:
谢谢。我知道安全问题,但这对我没有影响。以上是关于bash: while read loop - 如果有变量 sshpass 则停止的主要内容,如果未能解决你的问题,请参考以下文章
[Bash Scripting LOOP]for, while. until
[Bash Scripting LOOP]for, while. until
Bash 'while read line' 成一个数组并求和
在bash'while read'循环中设置的变量在它之后未设置[重复]