可以自动化使用密码(而非无需密码的ssh)进行登录吗?

4

尽管存在安全问题,我希望通过将密码以明文形式放入脚本文件中来自动化ssh登录。例如,我尝试了以下操作,但没有成功...

echo "mypassword" | ssh -X root@remote_node_address

它仍然提示输入密码...

编辑:我知道如何设置无需密码的ssh(实际上已经做过了)。我的问题实际上是如何自动化设置无需密码的ssh过程...


4
你可以尝试生成无需密码的密钥,以实现自动化 SSH 登录。 - Michal Klouda
请查看此处的man页面http://unixhelp.ed.ac.uk/CGI/man-cgi?ssh+1,其中提到“用户通过运行ssh-keygen(1)来创建他/她的密钥对。”接下来是这句话:“此后,用户可以无需输入密码登录。” - Richard Chambers
@MichalKlouda 我想要自动化设置无需密码的ssh过程。 - Richard
3个回答

9

使用Expect自动化

您可以使用Expect来驱动SSH密码身份验证。例如:

#!/usr/bin/expect -f
set timeout -1
spawn ssh -o PubkeyAuthentication=no host.example.com
expect -exact "Password: "
send -- "secret\r"
expect {\$\s*} { interact }

这个脚本是一个非常基础的例子,在面对故障或在非标准远程TERM(如GNU screen)下运行时,并不特别健壮,但它适用于常见情况。您也可以使用expect-dev软件包中的/usr/bin/autoexpect根据手动会话生成自己的自定义脚本。


1
请参考Can Expect understand screen-oriented (Curses) programs?,了解如何让Expect与GNU screen配合使用的一些指针。 - Todd A. Jacobs
1
@Richard 这是一个正则表达式,用于查找标准的 shell 提示符,然后在看到它时发出 interact 命令。大多数 expect 命令都是模式/动作对,尽管更复杂的配置也是可能的。 - Todd A. Jacobs

2

您需要使用公钥身份验证,详情请参见

http://www.ece.uci.edu/~chou/ssh-key.html

为了为现有主机添加新密钥,您需要自动更新远程计算机上的~/.ssh/authorized_keys中的公钥。

这很容易完成,只需使用

ssh-keygen -t rsa -b 1024 -f ~/.ssh/new-key -P ""
cat ~/.ssh/new-key.pub | ssh root@target-host 'cat >> ~/.ssh/authorized_keys'

然后您可以使用新密钥访问主机。
ssh -i ~/.ssh/new-key root@remote-host

0

我最近遇到了empty。我很惊讶它似乎不是很出名,因为当类似“如何自动化ssh”这样的问题出现时,很少被提及。

我在openwrt上使用它,它的大小仅约为7KB,无需其他依赖项,而tcl包的大小约为440KB。您可以直接在shell中使用它。

“empty是一个实用程序,提供了一个接口来执行和/或与伪终端会话(PTY)下的进程进行交互。该工具在编写用于与交互式程序通信的shell脚本方面绝对有用,例如telnet、ssh、ftp等。在某些情况下,empty可能是TCL / expect或其他类似编程工具的最简单替代品”

例如:

#!/bin/sh

empty -f -i in -o out telnet foo.bar.com
empty -w -i out -o in "ogin:" "luser\n"
empty -w -i out -o in "assword:" "TopSecret\n"
empty -s -o in "who am i\n"
empty -s -o in "exit\n"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接