通过SSH的sqlplus无法解析tns

时间:2018-08-16 18:07:23

标签: oracle amazon-ec2 sqlplus amazon-rds tnsping

我设置了一个EC2实例和RDS实例。然后在EC2实例上安装oracle实例客户端。之后,我设法执行sqlplus并从EC2实例连接数据库。为此,我创建了一个tnsnames.ora文件,然后输入数据库的服务详细信息。

我能做

sqlplus user/password@db_alias

但是我做不到,(这会导致错误:ORA-12154:TNS:无法解析指定的连接标识符)

ssh username@ip sqlplus user/password@db_alias

还配置了少密码ssh。我正在对当前计算机本身执行ssh。任何想法都会有所帮助。

详细信息。由于我安装了oracle实例客户端,因此tnsping命令不可用。我通过在.profile文件中添加以下功能来实现这一点。

whence tnsping >/dev/null 2>&1 ||
  tnsping() {
    sqlplus -L -s x/x@$1 </dev/null |
      grep ORA- |
        (grep -v ORA-01017 || echo OK)
  }

1 个答案:

答案 0 :(得分:1)

此问题可以缩小为加载环境变量(特别是$TNS_ADMIN)时遇到的问题。由于.bashrc可以验证登录外壳是交互式外壳还是非交互式外壳,因此未加载底部定义的变量。

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

无法通过ssh解决tns的原因是$TNS_ADMIN变量不可用。通过在.bashrc的开头定义该变量,我可以解决此问题。

另请参见Why does an SSH remote command get fewer environment variables then when run manually?