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'循环中设置的变量在它之后未设置[重复]

Linux - bash while subshell中变量操作的问题

while循环的条件?