shell-init:错误检索当前目录:getcwd - 通常的修复程序不工作

时间:2015-04-01 17:18:49

标签: linux bash shell ssh ansible

我有一个简单的脚本:

#!/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存在一些混淆,并且如果问题是/ opt,则替换/etc/init.d。没有区别

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

任何见解都会受到赞赏。

4 个答案:

答案 0 :(得分:22)

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

至少这是我的情况。

答案 1 :(得分:3)

根据this answer,当“您重新创建目录”但在此位置已经有一个shell时会发生这种情况,因此我们可以简单地运行:

cd ~ && cd -

答案 2 :(得分:0)

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

但它不是剧本,对吗?这是一个主机列表!

只需添加单词cat即可。

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

答案 3 :(得分:0)

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