如何进行非交互式远程SSH连接

12

我正在尝试通过以下命令从本地主机连接到远程主机。但是,远程主机上有一个设置,即在我们登录后不久,它会提示输入徽章ID、密码和登录原因,因为在remote-hostprofile文件中编码了这样的操作。如何克服这些步骤并直接无需交互式登录,而不干扰profile中的代码。

jsmith@local-host$ ssh -t -t generic_userID@remote-host
Enter your badgeID, < exit > to abort:
Enter your password for <badgeID> :
Enter a one line justification for your interactive login to generic_userID

你在远程主机上的默认 shell 是什么? - dcorking
3个回答

12

小修改:为了克服远程服务器的预期方法,需要采取一种方法,但如果本地脚本连接到一堆可能会出问题的远程服务器,请使用SSH选项:

ssh -f -q -o BatchMode=yes -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null USER@TARGETSYSTEM

如果没有设置ssh_key,这将省略要求密码,静默退出并继续执行脚本/其他主机。

使用-f将ssh放到后台,从sh(批处理)文件调用ssh命令时需要,以删除本地控制台重定向到远程输入(意味着-n)。


在ssh和ssh配置文件中设置StrictHostKeyChecking和UserKnownHostsFile是我得到非交互式ssh的唯一方法。 - AntonioCS

3

建议考虑编写一个包装脚本,围绕expect。这将完全实现您要求的功能。

这里有一些例子可以供您参考。


1
我已经点赞Marvin Pinto的回答,因为这是脚本化的理由,以防万一您需要配置文件中的其他功能,例如每日消息motd
然而,如果您不想编写脚本并且不需要配置文件中的其他功能,则有一个快速而简单的替代方法。根据远程主机上首选的shell,您可以要求该shell绕过配置文件。例如,如果远程主机上有bash,则可以使用以下命令调用它:
ssh -t -t generic_userID@remote-host bash --noprofile

我在macOS 10.13版本的OpenSSH上进行了上述测试。通常,在ssh调用末尾的命令是非交互式运行的,但是-t标志允许bash启动交互式shell。

详细信息请参阅Bash参考手册中的启动文件部分


2
这可能不会按预期工作。那个ssh命令将导致sshd将字符串“bash --noprofile”作为shell命令调用。换句话说,sshd将调用等效于$SHELL -c 'bash --noprofile'的命令。由sshd启动的shell实例仍将执行其执行的任何初始化。 - Kenster
@Kenster 我使用bash作为默认shell进行了测试,~/.bash_profile没有运行。 - dcorking
“-t user@host bash --noprofile” 在模拟远程主机上的非交互式 shell 方面非常有帮助。我想模拟脚本将在其中执行的环境(特别是 $PATH),因为非交互式 shell 不会像交互式 shell 一样隐式地 source .bash_profile - Bill Feth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接