【问题标题】:When invoking a shell script from oracle DB Java procedure, the linux commands inside script are not being recognized从 oracle DB Java 过程调用 shell 脚本时,无法识别脚本中的 linux 命令
【发布时间】:2021-06-10 13:35:03
【问题描述】:

为了在调用 FTP 时调试可能的权限相关问题,通过从 oracle JAVA 过程调用 shell 脚本来测试它。 该脚本包含一些标准命令,如 whoami(找出会话用户)、ls、.. 当直接从服务器调用时,该脚本工作正常。 但是,当从 DB JAVA 过程调用时,它只识别“echo”命令。在这方面的任何想法都会有很大帮助。谢谢!

shell 脚本(FileTransfer.sh):

``#!/bin/ksh` 
`echo "from double" >> /usr/users/ais/data/utl_data/Logs1.txt`
whoami >> /usr/users/ais/data/utl_data/Logs1.txt
ls >> /usr/users/ais/data/utl_data/Logs1.txt
echo "from double line 11" >> /usr/users/ais/data/utl_data/Logs1.txt
echo "from double line 13" >> /usr/users/ais/data/utl_data/Logs1.txt

JAVA程序

public class FTPTest{
public static int testSH () throws Exception {
   String[] command = { "sh" "/usr/users/ais/data/utl_data/FileTransfer.sh"};
   Process p = Runtime.getRuntime().exec(command);
   try {
     p.waitFor ();
   }
   catch (InterruptedException ie) {
   ;}
   return p.exitValue ();
}

【问题讨论】:

  • 确定通过 Java 代码执行脚本时的 PATH 设置将指向 whoami 和其他命令的位置?
  • 在脚本中添加echo $PATH ...
  • 嗨,路径----/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin: /opt/puppetlabs/bin:/usr/users/oracle/.local/bin:/usr/users/oracle/bin 但这仅在从 shell 调用时再次出现。从 JAVA 完成后,我没有得到 $PATH 的任何输出..

标签: java oracle shell


【解决方案1】:

正如您在 cmets 中确认的那样,当您的脚本通过 Java 代码调用时,$PATH 为空。

这意味着您必须为脚本中的命令提供完全限定的名称;在我的系统上,脚本应该如下所示:

#!/bin/ksh 
echo "from double" >> /usr/users/ais/data/utl_data/Logs1.txt`
/usr/bin/whoami >> /usr/users/ais/data/utl_data/Logs1.txt
/bin/ls >> /usr/users/ais/data/utl_data/Logs1.txt
echo "from double line 11" >> /usr/users/ais/data/utl_data/Logs1.txt
echo "from double line 13" >> /usr/users/ais/data/utl_data/Logs1.txt

它适用于 echo,因为这是 shell 本身内置的命令。

which检查whoamils的路径:

which whoami
which ls

【讨论】:

    【解决方案2】:

    你好,路径----/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/puppetlabs/ bin:/usr/users/oracle/.local/bin:/usr/users/oracle/bin 但这仅在从 shell 调用时再次出现。从 JAVA 完成后,我没有得到 $PATH 的任何输出..

    最简单的方法如下:

    String[] command = { " sh ", "/usr/users/ais/data/utl_data/FileTransfer.sh" };
    
    String[] envp = { "PATH=/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/puppetlabs/bin:/usr/users/oracle/.local/bin:/usr/users/oracle/bin" };
    
    Process p = Runtime.getRuntime().exec(command, envp);
    

    【讨论】:

      【解决方案3】:

      许多其他调度工具也存在同样的“问题”。最简单的方法是启动脚本并获取运行它的用户的配置文件(例如 .bash_profile)。这样您就可以灵活地使用相同的环境手动运行脚本。

      环境和路径确实很重要。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多