试图脚本尽可能干净,我想知道是否有一些解决scheme的以下情况:
一台Linux服务器运行sshd和一个android设备,并安装了dropbear ssh客户端和rsync(无服务器)。
我正在写一个脚本,以远程运行一个cron备份Android内存到Linux服务器。 cron调用类似于:
ssh remoteuser@linuxserver -i path_to_rsa_key runthisscript.sh
runthisscript.sh用现有的数据执行一些操作,而在脚本中间我想做的是从android设备的rsync返回到服务器,利用已经打开的ssh连接(因为在android上没有sshd运行)。
我已经开发了其他的解决scheme,比如把我的服务器脚本分成几部分,然后一个接一个地调用它们,在中间使用rsync(android to server方向),但是我正在寻找一个更加优雅的解决scheme(单个脚本,大多数在服务器端完成的工作)。
想法?
我假设你希望能够从任何地方连接,所以你不能保证平板电脑将在什么公共IP地址(或者即使这将允许从服务器连接到平板电脑,因为它不可能是公众地址),否则你应该安装SSH deamon和ash rsync来连接这种方式。 否则,“反向隧道”可能是你正在寻找的东西。
如果您的Android设备上的SSH客户端支持反向端口转发,则可以使用它来构build隧道。 例如,在openssh中,可以在命令行上指定-R 2222:127.0.0.1:22 ,这意味着服务器上的内容可以连接到平板电脑上的SSHd服务器(只要在平板电脑上监听127.0.0.1上的端口22 )通过连接到127.0.0.1端口2222(重要的是要认识到,从服务器的PoV 127.0.0.1上的代码是服务器,命令行中的127.0.0.1是相对于SSH 客户端 )。 所以如果这样的话,你可以在服务器脚本中运行rsync [email protected]:/path/to/stuff/on/tablet /path/to/destination/on/server -e 'ssh -p 2222' -a --compress 。 -e选项用于指定SSH连接的非标准端口。
关于上面的一些更详细的说明(对不起,这是一个“思想转储”的一点,可能不是很好,尽pipe希望它会帮助你经验和/或在其他地方查找有用的例子):
-L选项而不是-R (至less在OpenSSH中,请检查服务器的文档以进行确认)。 -R和/或-L选项,因此您可以使用单个SSH连接在任一方向设置多个隧道。 sshd_config指定的GatewayPorts yes或者类似的反向隧道来工作。 详细信息请查看您的SSHd实现的文档。 -R 8888:192.168.42.42:80 ,这意味着到服务器上127.0.0.1:8888的连接将通过SSH隧道并在任何时候点击80端口机器在平板电脑当前所在的networking上回答192.168.42.42(这甚至可能是另一个位于完全不同位置的远程机器)。 537:127.0.0.1:537或者(如果您在服务器上已经在服务器模式下运行rsync,因此端口537被采用,如5537:127.0.0.1:537并添加-p 5537 rsync命令告诉它服务器不在标准的地方)。 -R部分,如下所示: -R 192.168.1.1:22:127.0.0.1:22 。 绑定地址是相对于服务器,所以不需要是公共地可路由的东西(事实上,虚拟接口上的地址甚至本地局域网的其余部分都看不到)。 您肯定需要GatewayPorts才能使用OpenSSH。 如果您不需要 GatewayPorts (例如,如果使用127.0.0.1服务器端和非标准端口,并且与您的服务器的SSHd实施一起使用,而不使用GatewayPorts yes或equivelant),请将其closures:这样更安全。 假设你的客户端和服务器的SSH / SSHd实现支持这一切,那么通过SSH以这种方式configuration隧道可以非常强大,一旦你和他们一起玩,找出它可能做什么和怎么做。
你可以看看rsrsh的–rsh / -e参数。
你可以用cat或者类似的东西replacersh。 但是你必须在android端添加一个脚本,将脚本的输出发送到shell。
Android方面:
socat 'EXEC:/bin/bash' 'TCP-LISTEN:20000' & ssh remoteuser@linuxserver -i path_to_rsa_key -R 20000:127.0.0.1:20000 runthisscript.sh
helper.sh:
#!/bin/sh host=$2 port=$1 shift 2 { echo exec "$@" socat 'STDIN' 'STDOUT' } | socat '-' "TCP:$host:$port"
runthisscript.sh:
rsync -e './helper.sh 20000' --blocking-io <SRC> <DST>