关于SSH 远程执行命令你要知道的二三事
前言
相信大家在工作的时侯,可能会遇到要利用ssh在本地执行远程机器的命令可以便捷地处理某些重复工作,我们希望做到:
- 免手工输入密码
- 支持执行多个命令,执行shell脚本
- 支持执行sudo的命令
免手工输入密码
我们可以使用ssh互信,sshpass和expect等工具来避免手工输密码。
使用过程可能会碰到如下需要手工输入yes的繁琐场景:
$sshusername@hostname Theauthenticityofhost...can'tbeestablished. ECDSAkeyfingerprintis... Areyousureyouwanttocontinueconnecting(yes/no)?
为了避免出现上述场景,往ssh命令添加如下参数:
$ssh-o"StrictHostKeyCheckingno"username@password
SSH互信
SSH互信的配置非常简单,首先生成sshkey:
$ssh-keygen
把publickey拷贝到信任方中:
$ssh-copy-id-i~/.ssh/id_rsa.pubusername@hostname
之后免密执行命令:
$ssh-o"StrictHostKeyCheckingno"username@passwordcmd
sshpass
sshpass是一个用于非交互的ssh密码验证工具,使用前先安装:
$yuminstallsshpass
使用如下:
$sshpass-ppasswordssh-o"StrictHostKeyCheckingno"username@hostnamecmd
expect
Expect是用来进行自动化控制和测试的软件工具。虽然学习成本较高,但是expect的功能强大,利用expect可以方便的执行远程命令。使用前先安装:
$yuminstallexpect
例如:
#!/usr/bin/expect spawnssh-o"StrictHostKeyCheckingno"username@hostname expect"*assword*" send"password\n" expect"*$*" send"command\n" expect"*$*" send"exit\n" expecteof
Expect不仅支持ssh,还支持scp,ftp等工具。
支持多命令和脚本
执行多条命令
sshpass和expect在支持多条命令上非常类似,只需用&&连接命令即可:
#sshtrust $ssh-o"StrictHostKeyCheckingno"username@password"cmd1&&cmd2"
例如:
#sshpass $sshpass-ppasswordssh-o"StrictHostKeyCheckingno"username@password"ls-a&&mkdirtest" #expect ...... expect"*$*" send"ls-a&&mkdirtest\n" ......
执行本地脚本
对于执行本地脚本,ssh和sshpass的用法类似。
#sshtrust $ssh-o"StrictHostKeyCheckingno"username@passwordbash-s对于expect,首先需要把脚本拷贝到远程主机,然后在远程主机执行该脚本,步骤如下:
... #Copyscripttoremotehost spawnscp-o"StrictHostKeyCheckingno"shell_script.shusername@hostname:~/ expect"*assword*" send"password\n" expect"*100%*" expecteof #Executetheshellscriptatremotehost spawnssh-o"StrictHostKeyCheckingno"username@hostname expect"*assword*" send"password\n" expect"*$*" send"shshell_script.sh\n" ......支持执行sudo命令
有些命令需要sudo权限才能执行,但是我们不希望重复的输入密码,我们可以把每条命令修改为如下:
cmd--->'echopassword|sudo-Scmd'例如:
$sshpass-ppasswordssh-o"StrictHostKeyCheckingno"username@password"echopassword|sudo-Smkdir/newdir"对于如echo,dd等部分命令,有时会出现如下失败场景:
$sshpass-ppasswordssh-o"StrictHostKeyCheckingno"username@password'echopassword|sudo-Sechohello>/newdir/newfile' bash:/newdir/newfile:权限不够解决办法如下:
cmd--->'echopassword|sudo-Ssh-c"cmd"' #Forexample $sshpass-ppasswordssh-o"StrictHostKeyCheckingno"username@password'echoWSfdl097018=|sudo-Ssh-c"echohello>/newdir/newfile"'如果采用expect,需要把脚本拷贝到远程主机,然后在远程主机采用sudo执行该脚本,相对sshpass更简便和健壮:
... #Copyscripttoremotehost spawnscp-o"StrictHostKeyCheckingno"shell_script.shusername@hostname:~/ expect"*assword*" send"password\n" expect"*100%*" expecteof #Executetheshellscriptatremotehost spawnssh-o"StrictHostKeyCheckingno"username@hostname expect"*assword*" send"password\n" expect"*$*" send"sudoshshell_script.sh\n" expect"*assword*" send"password\n" ......总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。