Shell脚本SSH行为

时间:2011-08-05 16:10:11

标签: shell ssh

我开始编写shell脚本编写大约2天

目前我有以下代码

echo "Permission to Access to Remote Machine"
ssh $USERNAME@$HOSTNAME  "pg_dump -f /dbexport.sql -t tb1 -t tb2 -t tb3 dbname"
echo "Permission to Access to Remote Machine to transfer data file"
scp $USERNAME@$HOSTNAME:/dbexport.sql /export/bin/
echo "Permission to delete temporary file on remote machine"
ssh $USERNAME@$HOSTNAME  "rm /dbexport.sql"
echo "Creating Database..."

现在我有两个问题

1-有一个很好的方法来进行一次这个操作吗?我现在必须做3次...而且我不想使用期望其他第三方脚本我也不想使用RSA密钥进行ssh身份验证

2-有没有办法知道这些命令是否出现故障?

非常感谢

4 个答案:

答案 0 :(得分:2)

要将数据库远程转储到本地文件,我将其转储到stdout并在本地重定向,例如。

ssh $USERNAME@$HOSTNAME "pg_dump -f /dev/stdout -t tb1 -t tb2 -t tb3 dbname" > /export/bin/dbexport.sql

在服务器上执行的命令行的返回码将作为ssh调用的返回码返回给您。如果ssh失败(例如连接问题),你得到255.如果一切正常,你得到0。

Bash为你提供shell变量$?中最后执行的命令的返回码。您可以通过以下方式使用它:

ssh $USERNAME@$HOSTNAME "pg_dump -f /dev/stdout -t tb1 -t tb2 -t tb3 dbname" > /export/bin/dbexport.sql
err=$?
if [ $err -ne 0 ]; then
  echo "Dump failed with error code ${err}!"
fi

或者如果您对确切的值不感兴趣:

if ! ssh $USERNAME@$HOSTNAME "pg_dump -f /dev/stdout -t tb1 -t tb2 -t tb3 dbname" > /export/bin/dbexport.sql; then
  echo "Dump failed!"
fi

pg_dump手册页可能会为您提供错误代码。从ssh手册页:

EXIT STATUS
     ssh exits with the exit status of the remote command or with 255 if an
     error occurred.

答案 1 :(得分:0)

对于你的第一个问题,我想不出将三个命令合并为一个的好方法如果他们都在远程机器上执行命令,你可以做类似的事情

ssh user@remote sh -c 'dothis ; dothat'

但你的中间有一个scp。我使用RSA或DSA密钥,但你说你不想这样做(为什么?)。

对于第二个问题,sshscp命令都返回一个状态,指示它们是否成功。例如,这个:

ssh user@remote /bin/false ; echo $?

应打印1,表示失败。 (如果您使用的是csh或tcsh,请将$?更改为$status。)阅读手册页(man sshman scp)并查找“退出状态”部分,底部。

答案 2 :(得分:0)

如果你绝对不想使用密钥(我不明白),有办法打开连接并随后使用它。

您可以使用ssh选项ControlMasterControlPath:首先使用ControlMaster=yes建立连接,询问密码,并在您告诉的地方留下控制套接字使用ControlPath执行此操作。随后,告诉你的ssh命令使用ControlMaster=no

这个套接字
echo "Creating control socket"
ssh $USERNAME@$HOSTNAME -o ControlMaster=yes,ControlPath=whereveryouwant -Nf
echo "Permission to Access to Remote Machine"
ssh $USERNAME@$HOSTNAME -o ControlMaster=no,ControlPath=whereveryouwant "pg_dump -f /dbexport.sql -t tb1 -t tb2 -t tb3 dbname"
echo "Permission to Access to Remote Machine to transfer data file"
scp -o ControlMaster=no,ControlPath=whereveryouwant $USERNAME@$HOSTNAME:/dbexport.sql /export/bin/
echo "Permission to delete temporary file on remote machine"
ssh $USERNAME@$HOSTNAME -o ControlMaster=no,ControlPath=whereveryouwant "rm /dbexport.sql"
echo "Creating Database..."

但是在这里我不太确定如何摆脱这种控制连接,这可能是一个安全风险,在适当的时候。也许您将-Nf替换为-f'睡眠30m',具体取决于整个过程将持续多长时间。

另一个替代方案是,如果远程stdout上没有其他输出,则可以直接通过管道获取SQL转储,而不使用临时文件。

ssh $USERNAME@$HOSTNAME "pg_dump -f - -t tb1 -t tb2 -t tb3 dbname"  > /export/bin/dbexport.sql

简短,整洁,没有可能令人不安的中间文件。 (但我不确定-f -部分 - 也许还有另一种方法可以告诉pg_dump将其内容输出到stdout。)

答案 3 :(得分:0)

从远程服务器复制到本地计算机而不创建文件,使用管道

  

ssh -C {ssh.user}@{remote_host} \'PGPASSWORD = {remote_dbpassword}   pg_dump -U {remote_dbuser} {remote_dbname} | bzip2 -c'\ | bunzip2 -dc   | PGPASSWORD = {local_dbpassword} psql -U {local_dbuser} {local_dbname}