如何通过 SSH 在 expect 中使用 CVS?

How to use CVS in expect through SSH?

我找不到在测试服务器上自动将 CVS 密码传递给 运行 它的方法。我正在尝试制作一个 expect 脚本。

我有一个 ssh 别名,为此我创建了一个 ssh-copy-id,因此 ssh 的密码处理没有问题。

我想效仿:

ssh name;
run_remote_script.sh 
#(which triggers cvs update at the good place. Nb, the server has a MOTD)
expect "Password:"
send "${CVS_REMOTE_PASSWORD}\n" #enter the password

我做到了:

#!/bin/bash

SOFT=$(basename [=11=])

if [ -z ${CVS_REMOTE_PASSWORD+x}  ];then
    echo "$SOFT : Undefined variable $CVS_REMOTE_PASSWORD"
fi

hostname="company"

/usr/bin/expect <<EOD
spawn ssh $hostname
cvs_company.sh
expect "Password:"
send "$CVS_REMOTE_PASSWORD\n"
interact
EOD

我想指出,尽管 'company' 是一个占位符,但键入 ssh company 在我的控制台中工作得很好。

我的脚本有什么问题?它产生 "Invalid command name cvs_company.sh while executing cvs_company.sh"

有正确的方法吗?

听起来你需要这样的东西:

expect << EOD
spawn ssh $hostname
expect "YOUR-SHELL-PROMPT"
send "cvs_company.sh\r"
expect "Password:"
send "$CVS_REMOTE_PASSWORD\r"
interact
EOD

我不确定 CVS 身份验证的工作原理,但看看您是否可以这样做:

ssh $hostname "echo '$CVS_REMOTE_PASSWORD' | cvs_company.sh"

这假设您的密码不包含单引号。如果是这样,则有一些简单但丑陋的解决方法。

Expect 是一个很棒的工具,但在很多情况下您不需要使用它。