bash: while read loop - 如果有变量 sshpass 则停止

     2023-03-15     259

关键词:

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

】在bash\\\'whileread\\\'循环中设置的变量在它之后未设置[重复]【英文标题】:Variablessetinabash\'whileread\'loopareunsetafterit[duplicate]在bash\'whileread\'循环中设置的变量在它之后未设置[重复]【发布时间】:2014-05-0521:24:24【问题描述】:我... 查看详情

Databricks (Azure) SQL 中的 For/Loop/While

】Databricks(Azure)SQL中的For/Loop/While【英文标题】:For/Loop/WhileinDatabricks(Azure)SQL【发布时间】:2021-12-2408:58:19【问题描述】:有人知道我是否可以在Databricks中的SQL中进行迭代构造(如循环、while、for)吗?【问题讨论】:写下你想... 查看详情

7read的使用和while循环(代码片段)

read使用如下实例,如果给的变量和参数个数一样就对应给变量赋值(如下图1),如果变量多了,对应赋值,后面的变量为空(如下图3)如果变量少了,就对应赋值,最后一个变量全部赋值给剩余的参数(如下图2)下面-n是不换... 查看详情

bash编程练习脚本

...;分别这两类用户的个数;通过字符串比较来实现;通过while循环遍历来实现。while循环的特殊用法(遍历文件的行):        while read VARIABLE;d 查看详情

shlinux.bash.loops(代码片段)

查看详情

bash/expect/loop - 如何循环执行 telnet 的简单 bash 脚本

】bash/expect/loop-如何循环执行telnet的简单bash脚本【英文标题】:bash/expect/loop-howtoloopasimplebashscriptdoingtelnet【发布时间】:2013-12-3013:21:06【问题描述】:我想循环运行这个脚本。需要做的是读取该文件中包含IP地址的文件,例如:1... 查看详情

“Do While”“Loop”和“While”“Wend”循环。有啥不同?

】“DoWhile”“Loop”和“While”“Wend”循环。有啥不同?【英文标题】:"DoWhile""Loop"and"While""Wend"Loop.What\'sthedifference?“DoWhile”“Loop”和“While”“Wend”循环。有什么不同?【发布时间】:2015-12-2002:... 查看详情

vb中while.....wend与dowhile.....loop区别

在循环语句中的while.....wend与DOwhile.....loop我刚学VB,总觉的理解不清,这两个语句有什么在应用中有哪些具体的区别,最好举出些例子说明下,谢谢各位大哥大姐叔叔伯伯了!!!!VB中while.....wend与DOwhile.....loop区别为:退出不... 查看详情

shfor-loop-read-line.sh(代码片段)

查看详情

while语句

#!/bin/bash while read line do         IP=`echo $line | awk ‘{print $2}‘`      & 查看详情

tf.while_loop(代码片段)

tf.while_loop(cond,        body,        loop_vars,        shape_invariants=None,        parallel_iterations=10,        back_prop=True,     swap_memory=False,        name=None,      ... 查看详情

从bash中的stdin读取时如何处理中断信号[重复]

】从bash中的stdin读取时如何处理中断信号[重复]【英文标题】:Howtohandleinterruptsignalwhenreadingfromstdininbash[duplicate]【发布时间】:2016-11-1901:27:01【问题描述】:我在玩bash读取功能。我喜欢我目前外壳上的一个简单层。read-e执行制表... 查看详情

使用 tf.while_loop 对张量进行切片

】使用tf.while_loop对张量进行切片【英文标题】:Slicetensorusingtf.while_loop【发布时间】:2019-01-1203:45:42【问题描述】:只要还有一些列使用tf.while_loop,我就会尝试将张量切成小块。注意:我使用这种方式是因为我无法在图形构建... 查看详情

计算 tf.while_loop 的每个时间步长的梯度

】计算tf.while_loop的每个时间步长的梯度【英文标题】:Computegradientsforeachtimestepoftf.while_loop【发布时间】:2018-09-0808:23:09【问题描述】:给定一个TensorFlowtf.while_loop,我如何计算x_out相对于每个时间步的网络所有权重的梯度?networ... 查看详情

选择多列时,脚本(while-loop)停止并且没有输出

】选择多列时,脚本(while-loop)停止并且没有输出【英文标题】:script(while-loop)stopsandhasnoouputwhenmultiplecolumnsareselected【发布时间】:2013-03-2023:39:41【问题描述】:我想从TABLE中选择多个列,但是一旦while循环开始,脚本就无法工... 查看详情

vb中的do while……loop 和do……loop while语句是一样的吗

参考技术A不一样!前者是在满足while的条件后执行do后的语句,不满足则跳出循环;后者是满足while后的条件后再次执行循环内容。简单来说,后者至少都会执行循环内容一次,而前者可能一次都不会执行。举个例子吧:(1)DimIAsIn... 查看详情

bash之read命令

bash之read命令一、概述read命令接收标准输入(键盘)的输入,或者其他文件描述符的输入。得到输入后,read命令将数据放入一个标准变量中。二、使用举例(这里仅列出一些常用的选项)1.基本读取echo -n     &... 查看详情

bash怎么逐行读取一个文件

... 在Linux、OSX、*BSD或者类Unix系统下你可以使用​​while..do..done的bash循环来逐行读取一个文件。下面跟着我一起来了解一下在Linux或类UNIX系统下如何使用KSH或BASHshell逐行读取一个文件吧。  Bash逐行读取一个文件方法  ... 查看详情