轉shell不能執行su 后的腳本


##感謝haoxiaoyu

https://www.cnblogs.com/haoxiaoyu/p/4302663.html

shell不能執行su 后的腳本

 
問題:在shell腳本中執行“su – 用戶名”后,腳本終止執行,並且切換到su 中指定用戶名的交互式界面 
現象:我在root中執行一個腳本,但是其中的一些命令或腳本必須用oracle用戶來執行。,
復制代碼
[root@HZ-ITF-01 cron.d]# vi /data/itf/app/oracle/sync/test.sh
 #!/bin/bash
set -x
su - oracle
sqlplus /nolog <<EOF
conn hxy/hxy
create table test1 as select * from dba_tables;
exit
EOF
復制代碼

在root用戶下執行sh /data/itf/app/oracle/sync/test.sh后,停止在oracle用戶的交互界面不在往下執行 ,需要手動輸入exit才能繼續,但是在腳本中加入exit也不好使 

分析: 
a、su – 之后就直接切換環境並且等待用戶的交互式訪問了,不在繼續執行腳本中的命令 
b、su后的bash是一個子shell,腳本里寫exit沒有用,這些都要等su這個進程結束后才會執行。 
解決方案: su – 用戶 -c 命令 
     或者 
     sudo -u 用戶 命令 參考示例: 參考資料: Shell 中切換用戶
 
然后腳本修改成下面的方式
復制代碼
#!/bin/bash
#set -x 
su - oracle -c sqlplus /nolog <<EOF conn hxy/hxy create table test1 as select * from dba_tables; exit EOF
復制代碼

 腳本順利執行

或者改成:
復制代碼
#!/bin/bash
set -x 
su - oracle <<! sqlplus /nolog <<EOF conn hxy/hxy create table test1 as select * from dba_tables; exit EOF
!
復制代碼

也可以順利執行

 

shell不能執行su 后的腳本

 
問題:在shell腳本中執行“su – 用戶名”后,腳本終止執行,並且切換到su 中指定用戶名的交互式界面 
現象:我在root中執行一個腳本,但是其中的一些命令或腳本必須用oracle用戶來執行。,
復制代碼
[root@HZ-ITF-01 cron.d]# vi /data/itf/app/oracle/sync/test.sh
 #!/bin/bash
set -x
su - oracle
sqlplus /nolog <<EOF
conn hxy/hxy
create table test1 as select * from dba_tables;
exit
EOF
復制代碼

在root用戶下執行sh /data/itf/app/oracle/sync/test.sh后,停止在oracle用戶的交互界面不在往下執行 ,需要手動輸入exit才能繼續,但是在腳本中加入exit也不好使 

分析: 
a、su – 之后就直接切換環境並且等待用戶的交互式訪問了,不在繼續執行腳本中的命令 
b、su后的bash是一個子shell,腳本里寫exit沒有用,這些都要等su這個進程結束后才會執行。 
解決方案: su – 用戶 -c 命令 
     或者 
     sudo -u 用戶 命令 參考示例: 參考資料: Shell 中切換用戶
 
然后腳本修改成下面的方式
復制代碼
#!/bin/bash
#set -x 
su - oracle -c sqlplus /nolog <<EOF conn hxy/hxy create table test1 as select * from dba_tables; exit EOF
復制代碼

 腳本順利執行

或者改成:
復制代碼
#!/bin/bash
set -x 
su - oracle <<! sqlplus /nolog <<EOF conn hxy/hxy create table test1 as select * from dba_tables; exit EOF
!
復制代碼

也可以順利執行

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM