带有 ssh 的 bash 函数

带有 ssh 的 bash 函数

我刚刚第一次接触 bash。

我将如何在此范围内的服务器上运行某个功能?drush 状态仅在通过 ssh 连接的服务器上有效。

#!/bin/bash

function test {
    drush status
}

function connect {
    ssh user@serveraddress 'test'

}

connect

我知道您需要将远程代码放在 ssh 用户@服务器‘此处的代码’中,但是所有‘”等会使复杂的事情变得混乱。例如,这应该回显服务器的所有数据库名称。

function connect {


    ssh user@serveraddress 
   '

    dbuser=user
    dbpass=pass
    DBS=`mysql -u$dbuser -p$dbpass -Bse 'show databases'| egrep -v 'information_sch$
    for db in $DBS; do
        echo "DB name -  $db"
    done

    '   
}


connect

任何帮助链接表示感谢,欢呼

答案1

您可以使用此处的文档:

ssh user@serveraddress <<"END"
dbuser=user
dbpass=pass
DBS=$(mysql -u$dbuser -p$dbpass -Bse 'show databases'| egrep -v 'information_sch$')
for db in $DBS; do
    echo "DB name -  $db"
done
END

看:http://tldp.org/LDP/abs/html/here-docs.html

答案2

你不能只将脚本放在远程主机上并使用 ssh 来运行它吗

ssh [email protected] /path/to/script

或者如果你的脚本不需要命令行参数,你可以这样做

cat script | ssh [email protected]

编辑:

经过进一步研究,这可能是一个更好的解决方案

ssh [email protected] 'bash -s' <script 

或者

ssh [email protected] 'bash -s' <script param1 param2

如果存在 -s 选项,或者选项处理后没有剩余参数,则从标准输入读取命令。此选项允许在调用交互式 shell 时设置位置参数。

答案3

其他方式...

function connect {

    dbuser=user
    dbpass=pass
    DBS=`ssh user@serveraddress "mysql -u$dbuser -p$dbpass -Bse 'show databases'"|egrep -v 'information_sch$'`
    for db in $DBS; do
        echo "DB name -  $db"
    done

}

换句话说:仅在远程机器上运行最必要的代码,其余代码在本地运行。或者 - 根本不使用反引号:

function connect {

    dbuser=user
    dbpass=pass
    ssh user@serveraddress "mysql -u$dbuser -p$dbpass -Bse 'show databases'" \
    |egrep -v 'information_sch$' \
    |while read db; do
        echo "DB name -  $db"
    done

}

相关内容