【问题标题】:shell-init: error retrieving current directory: getcwd -- The usual fixes do not worshell-init:检索当前目录时出错:getcwd——通常的修复程序不起作用
【发布时间】:2015-06-06 11:05:41
【问题描述】:

我有一个简单的脚本:

#!/bin/bash
for server in $(~/.ansible/ansible_hosts)
do
    ssh $server "hostname; readlink /opt/mydir/mylink;"
done

它工作正常 - 程序返回正确的主机名和链接 - 除了我在某些但不是所有服务器上收到以下错误:

shell-init:检索当前目录时出错:getcwd:无法访问父目录:没有这样的文件或目录

所有目录都存在。最常见的建议之一是添加 cd、cd - 或 cd /。添加该步骤后发生的所有事情都是额外的:

chdir:检索当前目录时出错:getcwd:无法访问父目录:没有这样的文件或目录

我尝试启动 nfs 守护程序,以防我的 homedir 存在一些混淆,并替换 /etc/init.d 以防问题出在 /opt 上。没区别

这只是一个烦恼,除了当我尝试使用 ansible playbook 而不是简单的 ssh 命令时,该服务器会失败。

任何见解都将不胜感激。

【问题讨论】:

  • ~/.ansible/ansible_hosts 是否包含服务器列表?如果是这样的话,那是一种读取值的奇怪方式
  • 希望不是简单的权限问题?
  • 在这些机器上手动登录会发生什么?
  • arco444 - .ansible/ansible_hosts 实际上来自其他人的目录,这是我第一次看到问题的地方。我在我的主目录中尝试了 hosts.txt 文件。相同的行为。 Kashyap - 我有权在我的主目录和我尝试过的其他目录中。 shell 初始化文件在整个环境中都是相同的,手动登录不会引发这些错误。
  • 另一个人 - 完全正常,平安无事的登录。进一步的症状:“cd -”在 shell 中工作正常,但是当它在脚本中时,我看到“cd: OLDPWD not set”错误。

标签: linux bash shell ssh ansible


【解决方案1】:

在 Mac 上,只需终止并重新启动终端即可。它会做对的。

【讨论】:

    【解决方案2】:

    根据this answer,它发生在“你重新创建目录”但在这个位置已经有一个shell,所以我们可以简单地运行:

    cd ~ && cd -
    

    注意:如果您使用 zsh 并最终处于这种状态,您可能会在提示符的开头看到一个锁定图标(这通常表示您没有写入权限)。

    【讨论】:

      【解决方案3】:

      我认为该错误与脚本完全无关。问题是:您尝试运行脚本时所在的目录不再存在。例如,您有两个终端,cd somedir/ 位于第一个终端,mv somedir/ somewhere_else/ 位于第二个终端,然后尝试在第一个终端中运行任何内容 - 您将收到此错误消息。

      请注意,即使您重新创建具有相同名称的目录,您也会收到此错误,因为新目录将具有不同的 inode 索引。

      至少我的情况是这样。

      【讨论】:

      • 我同意普特尼克的观点。请记住,即使您的目录名称似乎没有更改,您也可能引用了一个符号链接,该链接引用了已更改的显式路径。这也让我很生气。
      • 或者你可以在某些功能中使用。
      • 这也是我的情况。我再次推送到服务器,显然这覆盖了我以前的代码,我得到了这个错误。我需要退出服务器,然后 SSH 回到服务器,错误就消失了。谢谢!
      • 当您从已删除然后重新创建但您没有刷新 shell 的文件夹中运行命令时,也会发生这种情况(在 Mac 上)。
      【解决方案4】:

      在我为测试用例创建和删除测试文件的tearDown 方法中,我的unittest 出现了同样的错误。奇怪的是,即使我有想要通过 for 循环删除的目录的完整路径,我也必须提供 os.chdir(path_where_dirs_at) 才能消除错误。不知道这是否是一个很好的解决方案,但消息消失了。

      【讨论】:

        【解决方案5】:

        您正在将其作为脚本执行.. $(~/.ansible/ansible_hosts)。 $() 表示 bash 将尝试执行该脚本,然后输出结果。

        但这不是脚本,对吧?这是一个主机列表!

        只需添加单词cat 即可。

        #!/bin/bash
        for server in $(cat ~/.ansible/ansible_hosts)
        do
            ssh $server "hostname; readlink /opt/mydir/mylink;"
        done
        

        【讨论】:

        • 很可能ansible_hosts是返回所有主机的脚本名称;否则,我认为脚本首先不会起作用,因为执行不可执行的结果将是空字符串(错误被打印到stderr),并且尝试循环不应该执行ssh 命令甚至一次...
        猜你喜欢
        • 2020-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-10
        • 1970-01-01
        相关资源
        最近更新 更多