Linux。。shell 脚本中经常要用到ssh。可是ssh又要交互式输密码。怎么能不交互的输密码呢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux。。shell 脚本中经常要用到ssh。可是ssh又要交互式输密码。怎么能不交互的输密码呢?相关的知识,希望对你有一定的参考价值。

shell 脚本中经常要用到ssh。可是ssh又要交互式输密码。怎么能不交互的输密码呢?
我要的不是不输密码,只是避免交互式输入

参考技术A 1、登录A机器
2、ssh-keygen -t [rsa|dsa],将会在~/.ssh下生成密钥文件和私钥文件 id_rsa,id_rsa.pub或id_dsa,id_dsa.pub
3、将 .pub 文件复制到B机器的 .ssh 目录, 并 cat id_dsa.pub >> ~/.ssh/authorized_keys
4、大功告成,从A机器登录B机器的目标账户,不再需要密码了(直接运行 #ssh 192.168.1.100 )

面交互输入,就得使用expect脚本,例:
#!/bin/bash
passwd='123456'
/usr/bin/expect <<-EOF
set time 30
spawn ssh root@192.168.1.100
expect
"*yes/no" send "yes\r"; exp_continue
"*password:" send "$passwd\r"

expect "*#"
send "cd /home/trunk\r"
expect "*#"
send "ls\r"
expect "*#"
send "exit\r"
interact
expect eof
EOF本回答被提问者和网友采纳

为啥在linux shell中ssh远程执行脚本时退出[重复]

【中文标题】为啥在linux shell中ssh远程执行脚本时退出[重复]【英文标题】:Why it is exit when ssh remote executed script in linux shell [duplicate]为什么在linux shell中ssh远程执行脚本时退出[重复] 【发布时间】:2020-10-22 19:51:05 【问题描述】:

在我的项目中,我需要找到在节点上处理的用户。

我有一个文件:jodIdUser。此文件中的内容有两列,例如:

395163 chem-yupy
395164 chem-yupy
395165 phy-xiel
395710 mae-chent

现在我有一个脚本 appRecord.sh,其中有一个 whle 循环。 while 方法代码如下:

cat $workDir/jobIdUser | while read LINE
do
  jobUser=`echo $LINE | awk 'print $2'`
  jobId=`echo $LINE | awk 'print $1'`

  jobOnNodes=`/usr/bin/jobToNode $jobId | xargs`
  echo $timeStr" "$jobId" "$jobUser" "$jobOnNodes  >> $workDir/tmpRecFile

  #20200702, it is needed to find out user process on nodes at this time here
   designatedNode=`echo $jobOnNodes | awk 'print $NF'`
   echo $jobOnNodes
   echo $designatedNode

   ssh $designatedNode sh $workDir/nodeProInfo.sh       ##Here code will exit while loop
   echo $timeStr" "$jobId" "$jobUser" "$jobOnNodes >> $workDir/$recordFile
 done

nodeProInfo.sh的代码如下:

#!/bin/bash
source /etc/profile
workDir=/work/ccse-xiezy/appRecord

hostName=`hostname`
jobInfo=`ps axo user:15,comm | grep -Ev "libstor|UID|ganglia|root|gdm|postfix|USER|rpc|polkitd|dbus|chrony|libstoragemgmt|para-test|ssh|ccse-x|lsf|lsbatch" | tail -n 1`

echo $hostName" "$jobInfo >> $workDir/proRes

现在我运行脚本 sh appRecord.sh,它是错误的。当第一个循环在while中时它会退出

[cc@login04 appRecord]$ sh appRecord.sh 
 r03n56 r04n09 r04n15
 r04n15
[cc@login04 appRecord]$

不知道为什么远程ssh节点方法会退出,谁能帮帮我?

更新:

我有另一个运行正常的脚本。 jobIdUser 的内容如下:

   r01n23  xxx-ser
   r92n12  yyn-ser

while 循环是:

cat $workDir/jobIdUser | while read LINE
do
     .............
     ssh $NODE pkill -u -9 $USER
     .............
done

【问题讨论】:

【参考方案1】:
cat $workDir/jobIdUser | while read LINE
do
   ...
   ssh $designatedNode sh $workDir/nodeProInfo.sh       ##Here code will exit while loop
   ...
done

ssh(以及循环内运行的所有其他命令)从while 循环的标准输入继承其标准输入。默认情况下,ssh 读取其标准 输入并将数据传递到远程进程的标准输入。这意味着 ssh 正在使用通过管道传输到循环中的数据,从而阻止 while 语句读取它。

您需要阻止 ssh 读取其标准输入。您可以通过以下两种方式之一执行此操作。首先,-n 标志阻止 ssh 读取其标准输入:

ssh  -n $designatedNode sh $workDir/nodeProInfo.sh

或者您可以从其他来源重定向 ssh 的标准输入:

ssh $designatedNode sh $workDir/nodeProInfo.sh < /dev/null

【讨论】:

重复项(这非常非常重复——不仅在我们的知识库中,而且在BashFAQ #89)应该被关闭,而不是回答;请参阅How to Answer 的“回答正确提问的问题”部分中有关“之前已经多次提出和回答过”的问题的要点。 @CharlesDuffy 我理解结束问题的概念,我知道这是一个常见问题解答。当我看到这个问题时,它已经过去了 7 个小时,没有任何票数接近。我的印象是这样的问题很难结束,因为每个版本的问题都有其独特的方式。 啊。那是金徽章dupehammer派上用场的地方。也就是说,如果某些东西是独一无二的,只是因为没有真正区分的原因(例如,一个答案将回答其他人;并且当以某种方式要求它变得更小时,OP 可以/应该简化问题已经消除了这些区别),它们并没有真正削减。 我有另一个带有 ssh 的 while 循环脚本,它运行良好。 jobIdUser 的内容如下:r01n01 ccc-xhiqcc。查看我的更新 @Kenster 我已经按照您所说的进行了测试,现在可以正常工作了。非常感谢

以上是关于Linux。。shell 脚本中经常要用到ssh。可是ssh又要交互式输密码。怎么能不交互的输密码呢?的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本中ssh到远程机子时,提示输入密码?用变量给出密码 要怎么做?请各位帮忙

python 模拟 ssh 执行远程命令

Shell 脚本 ssh免密码 登录 远程服务器 sshpass用法示例

如何在shell脚本中自动输入密码?

Linux写一个shell脚本,要实现在键盘输入一个进程号,输出这个进程号的子进程pid,怎么写?

经常用到的shell 脚本