2014-03-13 45 views
0

我是Unix的新手......我有一個調用sqlplus的shell腳本。我有一些在代碼中定義的變量。不過,我不覺得腳本中顯示密碼。如果有人能告訴我如何隱藏我的密碼,我將不勝感激。傳遞一個shell腳本中的變量

  1. 我知道的一種方法是省略密碼,sqlplus將 提示您輸入密碼。
  2. 我非常感興趣的方法是一個linux 命令,它的輸出可以傳遞到密碼變量中。那 的方式,我可以用一些參數輕鬆替換「測試」。
  3. 任何其他方法。

感謝

#This is test.sh It executes sqlplus 
#!/bin/sh 
export user=TestUser 
export password=test 
# Other variables have been ommited 
echo ---------------------------------------- 
echo Starting ... 
echo ---------------------------------------- 
echo 
sqlplus $user/$password 
echo 
echo ---------------------------------------- 
echo finish ... 
echo ---------------------------------------- 
+0

除非你知道你有一個令人信服的理由,否則不要使用'export' - 它會將密碼暴露給可以運行'ps -E'的任何進程作爲相同的帳戶(充其量)每個用戶在同一臺​​機器上(最壞的情況下)。 'user = TestUser',沒有'export',會爲shell設置一個局部變量,這通常足夠好。 –

回答

0

可以通過管道密碼sqlplus命令:

echo ${password} | sqlplus ${user} 
+0

行情。 'echo $ password'會將密碼(比如說'abc * def')更改爲'abc',接着是當前目錄中的一個名稱列表,然後是'def'。如果你真的堅持在這種情況下不增加任何值的額外冗長的話,你需要這個'echo'$ password''(或'echo $ {password}「''),以確保安全。 –

+0

不一定。 :)我假設海報使用bash,但問題簡單地標記爲[unix]和[shell]。默認情況下,zsh不會執行參數值的分詞。 –

+0

@justsomebody POSIX sh需要分詞,使得這種行爲是安全的假設,並且zsh在這方面不符合。畢竟,POSIX sh是**標準**(在形式上,標準體認可的意義上)UNIX shell語法;灰(相當)密切符合,bash是一個大超集,而zsh根本不符合。 (是的,它在標準血腥愚蠢的地方是不合規的,但是,這是一個標準,而且就是這樣)。 –

0

TL;博士:在命令行中的密碼很容易暴露在惡意代碼和用戶。不要這樣做。你有更好的選擇。

命令行是使用$0(命令本身)通過${!#}$#是參數的數量和${!name}取消引用的$name的值,在這種情況下$#)訪問。

您可以簡單地提供密碼作爲位置參數(比如說,第一個,或者$1),或者使用getopts(1),但是在arguments數組中的密碼是一個壞主意。考慮ps auxww(顯示所有進程的完整命令行,包括其他用戶的命令行)。

更願意以交互方式(stdin)或從配置文件獲取密碼。這些解決方案有不同的優缺點,所以請根據您的情況進行選擇。確保配置文件不被未經授權的用戶閱讀,如果你這樣做。使文件很難找到順便是不夠的。

交互式的東西可以用shell內置命令read來完成。

其在殼牌內置命令部分描述在bash的(1)包括

-s靜音模式。如果輸入來自終端,則字符不會被回顯。

#!/usr/bin/env bash 

INTERACTIVE=$([[ -t 0 ]] && echo yes) 

if ! IFS= read -rs ${INTERACTIVE+-p 'Enter password: '} password; then 
    echo 'received ^D, quitting.' 
    exit 1 
fi 

echo password="'$password'" 

讀bash的手冊中所述摘錄使用的其他構建體的說明。

shell腳本的配置文件非常簡單,只需在您的腳本中使用source ~/.mystuffrc即可。配置文件是一個普通的shell腳本,如果你只限於在那裏設置變量,它將會非常簡單。

的描述source,再次看到殼內置命令

+0

值得注意的是,從安全角度來看,在命令行上傳遞密碼是一件非常糟糕的事情 - 系統上的任何其他進程(包括以「nobody」運行的沙盒/不可信程序)都可以從命令行讀取它。 –

+0

@CharlesDuffy在答案中,你似乎錯過了「參數數組中的密碼是個壞主意」。 –

+0

是的,我做過了 - 我也在重讀時錯過了它。這暗示它可能需要變得更響亮。 :) –

相關問題