Bash 脚本登录到 ssh 和 运行 一些命令

Bash script login to ssh and run some commands

travis 完成并成功后,我正在尝试 运行 一个我很陌生的 bash 脚本。

我基本上希望它登录到远程服务器并从 git 上的 master 分支拉取,然后重新启动 node.js 服务器

spawn ssh couch@********* -o StrictHostKeyChecking=no
expect "assword:"
send "*******\r"
cd localer
forever stop server.js
git pull origin master
forever start server.js
exit

这是我目前所拥有的,但它给了我一个关于 travis-ci

的错误
./deploy.sh: line 1: spawn: command not found
couldn't read file "assword:": no such file or directory
./deploy.sh: line 3: send: command not found
./deploy.sh: line 4: cd: localer: No such file or directory
./deploy.sh: line 5: forever: command not found
From git://github.com/*******
 * branch            master     -> FETCH_HEAD
Already up-to-date.
./deploy.sh: line 7: forever: command not found

我在 travis 环境中安装了 expect,但它说 send 和 spawn 不是已知包所以我假设它们只是 bash 属性。

希望你能帮忙:)

最后是不是这样

#!/usr/bin/expect -f
spawn ssh couch@*************** -o StrictHostKeyChecking=no
expect "assword:"
send "*******\r"
set prompt {$ $}
expect -re $prompt
send "cd localer\r"
expect -re $prompt
send "forever stop server.js\r"
expect -re $prompt
send "git pull origin master\r"
sleep 10
expect -re $prompt
send "forever start server.js\r"
expect -re $prompt
send "exit\r"
expect eof

你为什么不使用 ssh 密钥?

在您的本地计算机上,运行 ssh-keygen,完成该过程后,获取 ~/.ssh/id_rsa.pub 的内容,登录您的远程服务器,将 [= 中的内容传递过去12=]

现在注销并尝试重新登录。系统不会再次提示您输入密码(最好将其以普通方式存储在脚本中),现在您可以使用此语法来 运行 远程命令:

ssh user@host "set -x; cd .; pwd; ls -lah; any command you want"

将明文密码放入文本文件确实不是一个好主意

设置 SSH public/private keys,然后您可以像这样简单地将本地脚本重定向到 ssh 到 运行 远程脚本:

ssh 用户@机器 'bash -s' < local_script.sh