【问题标题】:SSH with EOF correctly sets $PATH, but why doesn't it work without EOF?带有 EOF 的 SSH 正确设置了 $PATH,但是为什么没有 EOF 就不能工作?
【发布时间】:2019-09-09 07:27:46
【问题描述】:

我想了解为什么 ssh 不将 $PATH 设置为 .profile 中确定的任何内容,但似乎在 ssh 使用 EOF 时会这样做。

我想在我的脚本中运行这一行:

DIR_EXPANDED=`ssh $TOADDRESS "$(typeset -f get_dir); get_dir $DIR $DBNAME"`

get_dir 的定义如下:

function get_dir() {
  DIRECTORY_NAME=$1
  DBNAME=$2

  if [ -z "$DIRECTORY_NAME" ]; then
    echo "Enter Directory Name:"; read DIRECTORY_NAME
  elif [ -n "$2" ]; then
    . oraenv $DBNAME
  fi
  DIRECTORY=`sqlplus -s '/ as sysdba' << EOF
  set pages 0 head off feed off

  select directory_path from all_directories where directory_name='$DIRECTORY_NAME';

EOF`

  echo $DIRECTORY;
}

但是,运行脚本会导致错误

ksh[10]: .: oraenv: cannot open [No such file or directory]

我发现是因为 ssh'ing 时路径设置不正确,如下所示:

ssh $TOADDRESS 'echo $PATH'
/usr/local/bin:/usr/bin

通过反复试验,我发现这是可行的:

TODIR_EXPANDED=`ssh $TOADDRESS << EOF
  $(typeset -f get_dir); get_dir $TODIR $TODBNAME
EOF`

有人能解释一下为什么 ssh 会这样工作吗?以及如何/是否可以使用我首先描述的单线?

【问题讨论】:

    标签: oracle unix ksh


    【解决方案1】:

    如果您使用ssh HOST command,则会加载一个非交互式shell,它不会读取登录shell 的.profile 或交互式shell 的.kshrc

    如果您使用ssh HOST,它会启动一个交互式shell(尽管没有分配伪TTY)并读取.kshrc(或类似的,取决于生成的实际shell),然后继续从标准输入读取命令。

    所以,如果你想让这些功能可用,你可以这样做:

    DIR_EXPANDED=$(ssh $TOADDRESS ". ./.kshrc; $(typeset -f get_dir); get_dir $DIR $DBNAME")
    

    (我还将不推荐使用的命令替换形式(使用重音符号)更改为现代/POSIX 形式,因为这修复了一些错误。)

    【讨论】:

      猜你喜欢
      • 2014-08-20
      • 1970-01-01
      • 1970-01-01
      • 2016-09-11
      • 1970-01-01
      • 2016-05-21
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多