如何只使用一个命令通过ssh运行多个本地脚本?

时间:2015-08-20 18:04:09

标签: ssh

拥有多个脚本而不是一个脚本可能看起来很愚蠢,但有一个原因。

  • 模块化和可重用代码:我有不同的部署脚本,它们使用相同的与任务相关的子脚本。

  • 安全性:其中一个与任务相关的脚本是将我的应用程序的键导出为OS环境变量的脚本。您应该向管理员询问该脚本(出于安全原因,它不受版本控制)并将其粘贴到部署之前告知您的位置。这比使用重复代码在巨大脚本的某一行复制粘贴代码更容易,更清晰。

这是目前适用于我的脚本。 我想解决的问题是我必须多次输入ssh密码(在这种情况下为5),我想在开头只做一次

#!/usr/bin/env bash

set -e

PROJECT_PARENT_DIR=/srv/webapps
PROJECT_DIR_NAME=example
PROJECT_REPO_URL=https://github.com/user/example.git
VIRTUALENV_PARENT_DIR=/srv/virtualenvs
VIRTUALENV_DIR_NAME=example

ssh root@serverip "bash -s" < setup/download_project.sh $PROJECT_PARENT_DIR $PROJECT_DIR_NAME $PROJECT_REPO_URL
ssh root@serverip "bash -s" < setup/create_virtualenv.sh $VIRTUALENV_PARENT_DIR $VIRTUALENV_DIR_NAME
ssh root@serverip "bash -s" < setup/export_production_keys.sh production $VIRTUALENV_PARENT_DIR $VIRTUALENV_DIR_NAME
ssh root@serverip "bash -s" < setup/configure_project.sh production $PROJECT_PARENT_DIR $PROJECT_DIR_NAME $VIRTUALENV_PARENT_DIR $VIRTUALENV_DIR_NAME
ssh root@serverip "bash -s" < setup/configure_server.sh production $PROJECT_PARENT_DIR $PROJECT_DIR_NAME $VIRTUALENV_PARENT_DIR $VIRTUALENV_DIR_NAME

echo -e "\e[32mPRODUCTION DEPLOYMENT IS FINISHED! LISTENING AT http://example.com\e[0m"
echo ""

我无法在Stack Overflow或其他互联网资源上找到类似的问题/答案来帮助我解决这个问题。

1 个答案:

答案 0 :(得分:0)

在服务器端创建一个接收所有变量的脚本,然后让该单个脚本调用所有其他变量。

在客户端重新编写脚本以接收传入的10个变量。因此,您运行一次ssh命令,输入一次密码,一次性传递所有变量。然后其余部分在服务器端完成。