【问题标题】:TCSH scripts and the scp commandTCSH 脚本和 scp 命令
【发布时间】:2015-05-25 20:59:11
【问题描述】:

我对在 Ubuntu Linaro(在 Parallella 上)下看到的以下奇怪行为摸不着头脑。这个 scp 命令本身就可以正常工作:

$ scp user@UNIT1:~/myMPI/filename user@UNIT2:~/myMPI/

但是一旦我把它包装成一个脚本:

#!/bin/tcsh -f

scp user@UNIT1:~/myMPI/$1 user@UNIT2:~/myMPI/

发出来,我明白了:

$ thescript filename

user: invalid user name

用户名中没有空格或句点,这在命令行上也会失败,而不仅仅是在脚本中。尽管如此,tcsh 还是以某种方式破坏了 scp 命令。

帮助?

【问题讨论】:

  • 您的脚本以#!/bin/sh -f 开头,因此它是Bourne shell 脚本,而不是tcsh 脚本。 tcsh 脚本需要#!/bin/tcsh -f,其中-f 告诉shell 不要加载启动文件。 /bin/sh-f 选项完全不同(它禁用路径名扩展),这里不需要它。
  • 我的复制粘贴错误,现已修复。不幸的是,问题仍然存在。
  • 我无法重现该问题。这是您的 tcsh 脚本的确切 内容,还是您为发布而对其进行了修改? (用户名真的是user,主机名是UNIT1UNIT2吗?)
  • 主机名是逐字的,每个主机上的实际用户名是'linaro'。
  • 我建议通过逐字复制和粘贴 整个 脚本来更新您的问题。此外,在非 Linaro 系统上尝试相同的脚本(或尽可能相似的脚本)。

标签: scp csh tcsh


【解决方案1】:

这是scp 程序中发出该错误的代码:

int
okname(char *cp0)
{
    int c;
    char *cp;

    cp = cp0;
    do {
        c = (int)*cp;
        if (c & 0200)
            goto bad;
        if (!isalpha(c) && !isdigit((unsigned char)c)) {
            switch (c) {
            case '\'':
            case '"':
            case '`':
            case ' ':
            case '#':
                goto bad;
            default:
                break;
            }
        }
    } while (*++cp);
    return (1);

bad:    fprintf(stderr, "%s: invalid user name\n", cp0);
    return (0);
}

它不接受包含序数值大于 127 的字符或某些标点字符的用户名。大概您的脚本中的编辑用户名之一违反了这些条件之一。顺便说一句,我怀疑的第一件事是你那里有一个重音字符,或者可能是一些 unicode 文本。

【讨论】:

  • 不。用户名是“linaro”。而且,如果是这种情况,错误将再次出现在命令行上。不,这是 tcsh 和 scp 之间更奇怪的交互。
  • 你可以尝试通过“od -a”运行脚本文件,看看里面有没有有趣的字符。
【解决方案2】:

Kenster 做到了:脚本文件中的用户名前面隐藏着寄生的 $C2 (Â) $AD(软连字符)字符对。我不确定他们是如何进入那里的(也不知道为什么 Leafpad 没有显示他们),但现在他们已经走了,脚本按预期工作。

也感谢 Keith Thompson 的尝试。

【讨论】:

    猜你喜欢
    • 2012-10-16
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 2012-05-22
    • 1970-01-01
    • 2014-01-04
    相关资源
    最近更新 更多