我在这个问题的底部编写了启动脚本,尝试让我的一台设备在启动时使用我的 VPS 自动创建多个远程转发端口。 (我已经删除了 LSB 标签以保持重点,但它们是有效的。)运行脚本时我没有收到任何错误。它确实创建了 autossh 进程,但不与 VPS 建立任何连接。 (客户端是运行Debian Wheezy的Raspberry Pi,VPS是Ubuntu Server 14.10。)ssh
单独使用的命令做工作正常,所以我不知道为什么启动脚本不起作用。我注意到的一件事(如果你看下面)是,-f
当我使用脚本时,该标志被完全从进程中删除,但当我调用ssh
. PuTTY 确实将其标记-f
为绿色,与文本的其余部分不同,但我的谷歌搜索无法告诉我为什么会发生这种情况或者它是否与问题有关。 (注意:所有端口号均已更改,但仍然相互正确关联。)
我的公钥是正确的,并且远程主机位于和known_hosts
中。我尝试转义和不转义参数,这没有什么区别,并且在标志周围转义/使用引号也没有区别。user
root
-o
-f
更新:ssh exited with error status 255; restarting ssh
即使像 ssh(不是 autossh)一样运行各个命令,系统日志也会显示每个 autossh 行。无论脚本是运行还是直接在 bash 中运行脚本中的行,都会返回该错误。
脚本的相关部分init.d
:
case "$1" in
start)
echo "Creating SSH tunnels"
autossh -M 0 -f -N -o \"ServerAliveInterval 60\" -o \"ServerAliveCountMax 3\" -R 11111:localhost:22222 -i /home/username/.ssh/id_rsa -p 3333 user@server_ip
#same command repeated twice more, everything exactly the same but with different ports
;;
stop)
echo "Stopping SSH tunnels..."
ps axf | grep autossh | grep -v grep | awk '{print "kill -9 " $1}' | sh
;;
*)
echo "Usage: /etc/init.d/autossh-gen.sh {start|stop}"
exit 1
;;
esac
ps aux | grep autossh
这会导致运行时出现三行,但为了简洁起见,我将只在此处放置一行。没有与远程服务器建立实际连接;港口仍然关闭。请注意,-f
脚本中的命令不存在。
root 14137 0.0 0.1 1700 976 ? Ss 01:37 0:00 /usr/lib/autossh/autossh -M 0 -N -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -R 11111:localhost:22222 -i /home/username/.ssh/id_rsa -p 3333 user@server_ip
如果我只运行这个 ssh 命令...
ssh -f -N -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -R 11111:localhost:22222 -i /home/username/.ssh/id_rsa -p 3333 user@server_ip
...然后这是输出到ps aux
端口是转发成功。
root 14124 0.0 0.1 5728 1720 ? Ss 01:31 0:00 ssh -f -N -o ServerAliveInterval 60 -o ServerAliveCountMax 3 -R 11111:localhost:22222 -i /home/username/.ssh/id_rsa -p 3333 user@server_ip
答案1
ssh exited with error status 255
通常指出身份验证或连接问题。尝试运行autossh
不带-f
选项的命令,以便您可以看到其输出:
autossh -M 0 -N -o \"ServerAliveInterval 60\" -o \"ServerAliveCountMax 3\" -R 11111:localhost:22222 -i /home/username/.ssh/id_rsa -p 3333 user@server_ip
超出autossh
手册:
-f
请注意,使用 autossh 和使用 ssh之间有一个至关重要的区别-f
:当与autossh
ssh 将无法询问密码或密码短语。
您还可以尝试传递-v
或-vv
选项来ssh
帮助您进行调试:
autossh -M 0 -N -vv -o \"ServerAliveInterval 60\" -o \"ServerAliveCountMax 3\" -R 11111:localhost:22222 -i /home/username/.ssh/id_rsa -p 3333 user@server_ip
另请注意,该/usr/lib/autossh/autossh
进程会监视您的ssh
会话,并在需要时重新启动它。如果您的autossh
命令有效,您应该能够看到autossh
并ssh
处理:
$ps -eo user,pid,args | grep ssh
----------
someuser 16384 /usr/lib/autossh/autossh -M 33332 -N -R 11111:127.0.0.1:22222 serverip
someuser 16385 /usr/bin/ssh -L 33332:127.0.0.1:33332 -R 33332:127.0.0.1:33333 -N -R 11111:127.0.0.1:22222 serverip
顺便说一句,您不需要将该-f
选项传递给ssh
,autossh
默认情况下将在后台启动它。
答案2
初始化脚本可能在与手动尝试时不同的用户上下文中运行。如果init脚本使用不同的用户id运行,则检查私钥文件是否可以正确读取。
关键文件及其权限存在已知的配置问题。
执行 ssh 命令的用户需要访问身份文件,并且 ssh 在这方面可以严格要求用户拥有该文件、.ssh 目录,并且 .ssh 目录的权限为 700,私有目录的权限为 600密钥文件。